gpt4 book ai didi

f# - 如何声明可为空的受歧视联合?

转载 作者:行者123 更新时间:2023-12-02 07:21:21 25 4
gpt4 key购买 nike

我有这样一个受歧视的工会

type foo =
| Yes of bool
| Number of decimal

我有另一种类型,我试图将此 DS 作为可空成员进行处理

type test(value) =
member this.Value : Nullable<foo> = value

当我尝试这样做时,我得到“通用构造要求类型“foo”具有公共(public)默认构造函数。我该如何解决这个问题?

最佳答案

.NET 的 Nullable<T> type 实际上是为与值类型一起使用而设计的,例如 int而不是引用类型,例如 string因为它们已经可以为空。

默认情况下,可区分联合是引用类型,因为它们实际上被编译为一个类。但它们可以强制成为一个结构,这将使它成为一个值类型。但是,当您这样做时,您会收到另一个错误:If a union type has more than one case and is a struct, then all fields within the union type must be given unique names .您可以在每个案例中命名值,如本例所示:

[<Struct>]
type foo =
| Yes of yes:bool
| Number of number:decimal

现在你可以拥有一个Nullable<foo> .但您可能实际上并不想这样做。在 F# 中表示引用和值类型的“可空”值的正常方法是使用 Option类型。所以不要制作 foo一个结构,你应该将类型更改为 Option<foo>相反:

type test(value) =
member this.Value : Option<foo> = value

test(Some (Number 1M)) // some value
test(None) // no value

F# 很大程度上 使得 F# 中定义的类型不可能为空,因此您可以使用 Option对于一切,而不是区分引用类型和值类型。 Nullable只有在处理使用它的现有 .NET 代码时才真正有用。

关于f# - 如何声明可为空的受歧视联合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45065262/

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