可空类型和赋值运算符

Alp*_*pha 4 .net c# nullable operator-overloading assignment-operator

我一直认为.NET框架的可空类型只是框架给我们的一个很好的构造,但并没有添加到语言本身的任何新东西.

也就是说,直到今天,为了演示,我尝试创建自己的Nullable结构.

我得到了我需要的一切,除了这样做的能力:

var myInt = new Nullable<int>(1);
myInt = 1;
Run Code Online (Sandbox Code Playgroud)

问题是第二个语句,因为我不能以任何方式重载赋值运算符.

我的问题是:这是一个特殊情况,在赋值运算符有过载的语言中?如果没有,你会如何使之前的例子有效?

谢谢!

Ree*_*sey 10

赋值是使用声明为的隐式运算符来处理问题:

public static implicit operator Nullable<T> (T value)

处理时没有任何特定于语言的功能.

对于可空支持的语言的主要变化是能够将其写为:

 int? myInt = 1;
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式在您的类型中实现此

public static implicit operator Nullable<T> (T value)
{
    return new Nullable<T>(value);
}
Run Code Online (Sandbox Code Playgroud)

令人遗憾的是,有许多与Nullable<T>C#语言相关的功能,而CLR确实无法在您的代码中复制.

  • 好答案.此外,CLR支持将null值装入空值为空引用. (2认同)

pay*_*ayo 5

同上其他答案,但请注意,Nullable<T>确实也做了一些魔术.

引自Lippert的答案

C#自动将运营商提升为可空.没有办法说"自动将操作员提升到MyNullable".您可以通过编写自己的用户定义的运算符来获得相当接近.

C#具有空文字的特殊规则 - 您可以将它们分配给可空变量,并将它们与可空值进行比较,编译器会为它们生成特殊代码.

nullables的拳击语义非常奇怪,并且融入运行时.没有办法模仿它们.

is,as和coalescing运算符的可空语义被烘焙到语言中.

Nullables不满足struct约束.没有办法效仿.

等等.