2011-12-21 12 views
7

tengo el siguiente tipo:F # opción de tipo en 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 

donde el recursiva "Información de la lista" es una opción. O hay uno o no hay ninguno. Necesito usar esto desde C# pero obtengo errores. Este es un uso de muestra:

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

here listInfo es del tipo ListInfo como el anterior. Solo estoy tratando de verificar si contiene un valor y, si es así, quiero usarlo. Pero todos los accesos listInfo.LInfo dan el error "Propiedad, indexador o evento listInfo.LInfo no es compatible con el idioma ..."

¿Alguien que entiende por qué?

+0

no creo que el problema no tiene nada que ver con el tipo de opción ... Se ve como una propiedad declarada en F # no se reconoce por C# –

Respuesta

3

Sospecho que el problema es que LInfo propiedad getter/setter funciona con diferentes tipos (que no es compatible con C#).

Prueba este

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

O esto

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

Gracias, la primera solución funcionó bien así que fui con eso. – UmaN

+3

No es solo que no sea compatible con C# - No creo que se suponga que sea compatible con F # tampoco ... – kvb

+7

@kvb: Tiene razón: De la sección 8.13.1 de la especificación: _Si un miembro de la propiedad tiene tanto un getter como un setter, y ninguno es un indexador, entonces las firmas de getter y setter deben implicar el mismo tipo de propiedad._ – Daniel