在C#中,我可以声明一个可以为空的类型:
int? myNullableInt;
我正在尝试做一些互操作,需要在F#中声明并设置一个可空的类型,所以我声明了这样一个类:
type TestEntity() =
member val OptionalValue = Nullable(1) with get, set
后来我试图像这样分配它:
let testEnt = TestEntity()
testEnt.Optional <- null
但它不起作用。
在F#中执行此操作的正确方法是什么?此外,在互操作层,这与C#中的int?
行为相同吗?
答案 0 :(得分:7)
我建议避免使用与F#中的瘟疫类似null
的值,您应该使用Option<'T>
并在C#边界转换为Nullable<'T>
。
您可以使用Option<'T>
从Nullable<'T>
转换为Option.toNullable
。
您可以使用Nullable<'T>
从Option<'T>
转换为Option.ofNullable
。
testEnt.Optional <- Option.toNullable None
testEnt.Optional <- Option.toNullable (Some 5)
答案 1 :(得分:5)
试试这个:
testEnt.OptionalValue <- Nullable()
null
实际上并不是值类型的有效值。即使C#使用一些神奇的语法糖来处理null
,就像它与Nullable<T>
类型兼容一样,当你将null
分配给int?
时,你真正得到的结果是什么?在C#中是default(Nullable<int>)
(又名new Nullable<int>()
)。 F#没有添加这种语法糖,所以你必须更加明确它。但是,除了语言特定的更改之外,CLR将以与从C#处理Nullable<int>
相同的方式对待它。