2011-12-21 6 views
7

Ho il seguente tipo:Utilizzando F # opzione del tipo in C#

and ListInfo() = 

let mutable count = 0 

// This is a mutable option because we can't have an infinite data structure. 
let mutable lInfo : Option<ListInfo> = None 

let dInfo = new DictInfo() 
let bInfo = new BaseInfo() 

member this.BaseInfo = bInfo 
member this.DictInfo = dInfo 

member this.LInfo 
    with get() = lInfo 
    and set(value) = lInfo <- Some(value) 

member this.Count 
    with get() = count 
    and set(value) = count <- value 

dove il ricorsiva "lista info" è un'opzione. O ce n'è uno o non c'è nessuno. Ho bisogno di usare questo da C# ma ottengo errori. Esempio di utilizzo:

if (FSharpOption<Types.ListInfo>.get_IsSome(listInfo.LInfo)) 
{ 
    Types.ListInfo subListInfo = listInfo.LInfo.Value; 
    HandleListInfo(subListInfo, n); 
} 

qui listInfo è del tipo ListInfo come sopra. Sto solo cercando di verificare se contiene un valore e se è così voglio usarlo. Ma tutti gli accessi listInfo.LInfo danno l'errore "Proprietà, indicizzatore o lista eventiInfo.LInfo non è supportato dalla lingua ..."

Chi capisce perché?

+0

Io non credo che il problema abbia a che fare con il tipo di opzione ... Sembra una proprietà dichiarata in F # non è riconosciuto da C# –

risposta

3

Sospetto che il problema sia il getter/setter della proprietà LInfo con tipi diversi (che non è supportato in C#).

Prova questa

member this.LInfo 
    with get() = lInfo 
    and set value = lInfo <- value 

O questo

member this.LInfo 
    with get() = match lInfo with Some x -> x | None -> Unchecked.defaultof<_> 
    and set value = lInfo <- Some value 
+0

Grazie, la prima soluzione ha funzionato bene, quindi sono andato con quello. – UmaN

+3

Non è solo che non è supportato da C# - Non penso che sia supportato in F # o ... – kvb

+7

@kvb: Hai ragione: Dalla sezione 8.13.1 della specifica: _Se un membro di una proprietà ha sia un getter che un setter, e nessuno dei due è un indicizzatore, quindi le firme di entrambi getter e setter devono implicare lo stesso tipo di proprietà. _ – Daniel