2011-09-20 12 views
22

Questa è la dichiarazione tipica di un membro astratto in F #:Nessun nome di argomento nella dichiarazione astratta?

abstract member createEmployee : string -> string -> Employee 

Si definiscono i tipi di argomenti, ma non i loro nomi. Senza nomi, come si spiega quale parametro è quando si implementa l'interfaccia? In altre parole, come fai a sapere se l'interfaccia dovrebbe essere implementata come 1- o 2-?

1- member this.createEmployee firstName lastName = ... 
2- member this.createEmployee lastName firstName = ... 

Sto osservando il problema da una prospettiva errata (essendo utilizzato per C#)?

risposta

34

Che dire:

abstract member createEmployee : firstName:string -> lastName:string -> Employee 

?

+3

Grazie, questo è un po 'imbarazzante :-), non ho mai visto prima di esempi con params nome del documento on-line. –

+11

Ciò che è interessante è che è un errore racchiudere le coppie di nome parametro e digitare tra parentesi come si farebbe quando si specifica il tipo per parametri di funzione come: 'abstract member createEmployee: (firstName: string) -> (lastName: string) - > Employee' – danielrbradley

5

La sintassi per questo è superfine IMO. Ho voluto fare questo con i parametri come una tupla (come un metodo di C#) e solo attraverso tentativi ed errori ho fatto trovare questo lavoro:

abstract member PutChar : x:int * y:int * c:char * flag:Background -> unit 

E questa variante più brutta funziona anche:

abstract member PutChar : x : int * y : int * c : char * flag : Background -> unit 

Qui di seguito sono le cose che sentivano tutti ragionevole, ma venuto a mancare con lo stesso errore - Unexpected symbol ':' in member definition.:

// ALL BAD vvv 
    abstract member PutChar : (x:int * y:int * c:char * flag:Background) -> unit 
    abstract member PutChar : (x:int, y:int, c:char, flag:Background) -> unit 
    abstract member PutChar : (x:int) * (y:int) * (c:char) * (flag:Background) -> unit 
    // ALL BAD ^^^ 
+0

Senza i nomi dei parametri, la prima variante non valida sarebbe stata compilata con un metodo CLI che accetta un argomento che sembra essere una tupla. Questa è una firma notevolmente diversa da un metodo CLI a 4 argomenti; non puoi nominare i componenti delle tuple che sono nidificate come questa. Il secondo è sintatticamente non valido; la virgola non viene utilizzata sui tipi in questo modo. Non so perché il terzo non è permesso. – Vandroiy

Problemi correlati