在C#中,我可以像这样声明一个可空类型:
int? myNullableInt;
Run Code Online (Sandbox Code Playgroud)
我正在尝试做一些互操作,需要在F#中声明并设置一个可空类型,所以我声明了一个这样的类:
type TestEntity() =
member val OptionalValue = Nullable(1) with get, set
Run Code Online (Sandbox Code Playgroud)
后来我试着像这样分配它:
let testEnt = TestEntity()
testEnt.Optional <- null
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
在F#中执行此操作的正确方法是什么?此外,在互操作层,这与int?C#中的行为相同吗?
我建议避免使用可能null像F#中的瘟疫一样的值,你应该使用Option<'T>并转换到Nullable<'T>C#边界.
您可以转换Option<'T>为Nullable<'T>使用Option.toNullable.
您可以转换Nullable<'T>为Option<'T>使用Option.ofNullable.
testEnt.Optional <- Option.toNullable None
testEnt.Optional <- Option.toNullable (Some 5)
Run Code Online (Sandbox Code Playgroud)
试试这个:
testEnt.OptionalValue <- Nullable()
Run Code Online (Sandbox Code Playgroud)
null并不是值类型的有效值.即使C#做了一些魔法和语法糖来处理null好像它与Nullable<T>类型兼容,但是当你在C#中分配时,你最终null得到的int?是default(Nullable<int>)(又名new Nullable<int>()).F#没有添加这种语法糖,所以你必须更加明确它.但是除了语言特定的更改之外,CLR将以与处理Nullable<int>C#相同的方式对待它.| 归档时间: |
|
| 查看次数: |
460 次 |
| 最近记录: |