gpt4 book ai didi

c# - 为什么 FSharpOption 的某些属性(例如 IsSome 和 IsNone)在 C# 中不可见?

转载 作者:可可西里 更新时间:2023-11-01 08:42:52 26 4
gpt4 key购买 nike

在我看来,F# 选项类型的某些属性在 C# 项目中是不可见的。通过检查类型,我或多或少可以看出原因,但我真的不明白到底发生了什么,为什么做出这些选择或者如何最好地规避这个问题。

以下是演示该问题的一些片段。我有一个包含两个项目的 VS2015 解决方案,一个 C# 项目和一个 F# 项目。在 F# 项目中,我有一个定义如下的类:

type Foo () =

member this.Bar () = Some(1)

此外,在 F# 中我可以这样写:

let option = (new Foo()).Bar()
let result = if option.IsNone then "Is none" else "Is some"

所以看起来选项类型有一个名为 IsNone 的属性.现在,在 C# 项目中,我引用了从 F# 项目编译的 .dll。这让我可以写例如

var optionType = new Foo().Bar();

变量optionType是一个 FSharpOption<int> .如上所述,当我在 F# 项目中使用选项类型时,我通常可以访问例如 IsSome。和 IsNone特性。但是,当我尝试写类似 optionType.IsNone 的内容时,我收到 CS1546 错误“属性、索引器或事件……不受语言支持”。与此一致,Intellisense 不检测属性:

Intellisense does not detect the IsSome and IsNone properties

现在,在检查 FSharpOption 类型时,我可以看到 IsNone 和 IsSome“属性”显示为静态方法:

FSharpOption class signature from C#

另一方面,当我从 F# 检查类型时,我看到的是以下内容:

FSharpOption class signature from F#

在这里,“存在”的属性IsSomeIsNone很明显。将光标悬停在这些属性上,VS2015 给出了以下注释:“包含类型可以使用‘null’作为其 nullary 联合案例的表示值。该成员将被编译为静态成员。”这就是为什么除了静态方法之外,属性不可用的原因(如 lukegv 和 Fyodor Soikin 所指出的)。

所以,情况似乎是这样的:编译后的 FSharpOption 类型没有任何 IsNone 和 IsSome 属性。 F# 的幕后正在发生一些事情,以启用模拟这些属性的功能。

我知道我可以通过使用 OptionModule 来解决这个问题在 Microsoft.FSharp.Core 中。然而,这个功能似乎是 F# 核心库的架构师有意识的选择。选择的理由是什么?并且正在使用 OptionModule正确的解决方案,或者有更好的方法来使用 FSharpOption<T>从 C# 键入?

最佳答案

这与option 的编译方式有关。 Some 值直接编译为创建类的实例并将值包装在其中。但是 None 值并不是真正的值,它们只是 null

试试这个:

let a: int option = Some 1
let b: int option = None
let a_isNull = obj.ReferenceEquals( a, null ) // a_isNull = false
let b_isNull = obj.ReferenceEquals( b, null ) // b_isNull = true

(这也是 Nonewill show up as null in the debugger's Watch window 的原因)

这是一个在运行时节省大量周期的优化。 (您也可以通过应用 CompilationRepresentationFlags.UseNullAsTrueValue 将它用于您自己的联合类型)

现在,由于此类型的某些值可能为 null,因此您不能真正对这些值使用属性或方法。如果该值恰好为 null,您就会崩溃。这就是为什么您应该始终对所有操作使用 OptionModule

至于为什么这些属性没有出现在智能感知中——那是因为它们是static。虽然我不确定他们为什么会出现在那里。也许是编译器工件。

关于c# - 为什么 FSharpOption 的某些属性(例如 IsSome 和 IsNone)在 C# 中不可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41983631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com