如何在f#中将整数设置为null?

rys*_*ama 2 .net c# f#

在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#中的行为相同吗?

The*_*ght 7

我建议避免使用可能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)


Str*_*ior 5

试试这个:

testEnt.OptionalValue <- Nullable()
Run Code Online (Sandbox Code Playgroud)
  1. 您需要使用与您声明的可选属性相同的名称.
  2. null并不是值类型的有效值.即使C#做了一些魔法和语法糖来处理null好像它与Nullable<T>类型兼容,但是当你在C#中分配时,你最终null得到的int?default(Nullable<int>)(又名new Nullable<int>()).F#没有添加这种语法糖,所以你必须更加明确它.但是除了语言特定的更改之外,CLR将以与处理Nullable<int>C#相同的方式对待它.

  • @RodYan C#`int?`是`System.Nullable <int>`的同义词.他们是一回事. (2认同)