C#是否处理不允许来自F#的null的类型仍然可以为空?

时间:2012-11-01 12:54:27

标签: f#

它是C#和F#之间的互操作

在F#中,

type test =
{
    value: int
}

type Wrapper (value: test) =
    member val Value = value with get, set

let trythis = new Wrapper(null)  // error as expected

然而,在C#

 var trythis = new Wrapper(null);  //this runs fine

1 个答案:

答案 0 :(得分:8)

对类型的非可空约束是F#特定的特性,因此它在.NET中没有任何表示(因此C#不尊重它)。

事实上,您甚至可以使用不安全的Unchecked.defaultof<_>值在F#中解决此问题:

let trythis = new Wrapper(Unchecked.defaultof<_>) 

如果要检查暴露于C#的对象中的null,这非常有用:

type Wrapper (value: test) =
    if value = Unchecked.defaultof<_> then
      invalidArg "value" "Value should not be null."
    member val Value = value with get, set