在C#中使用F#选项类型

Uma*_*maN 7 c# f# option

我有以下类型:

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
Run Code Online (Sandbox Code Playgroud)

递归"列表信息"是一个选项.有一个或没有.我需要从C#中使用它,但我得到错误.这是一个示例用法:

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

这里listInfo的类型是ListInfo,如上所示.我只是想检查它是否包含值,如果是,我想使用它.但是所有访问listInfo.LInfo都会给出错误"语言不支持属性,索引器或事件listInfo.LInfo ......"

谁知道为什么?

Dan*_*iel 3

我怀疑问题是LInfo属性 getter/setter 适用于不同类型(C# 中不支持)。

尝试这个

member this.LInfo
    with get() = lInfo
    and set value = lInfo <- value
Run Code Online (Sandbox Code Playgroud)

或这个

member this.LInfo
    with get() = match lInfo with Some x -> x | None -> Unchecked.defaultof<_>
    and set value = lInfo <- Some value
Run Code Online (Sandbox Code Playgroud)

  • @kvb:你是对的:来自规范的第 8.13.1 节:_如果属性成员同时具有 getter 和 setter,并且都不是索引器,则 getter 和 setter 的签名必须暗示相同的属性类型。 _ (7认同)
  • 这不仅仅是 C# 不支持它 - 我认为 F# 也不应该支持它...... (3认同)