什么是解除运营商?

时间:2010-07-30 09:13:52

标签: c# .net nullable lifted-operators

我正在查看this article并且正在努力遵循解释提升运算符的VB.NET示例。似乎没有相应的C#示例或教程。我一般没有太多关于运算符重载的经验,所以在阅读可空类型的同时尝试使用VB.NET等价物可能不是最好的开始...

是否有人能够解释提升的运算符以及可空类型如何使用它们?它只是意味着可空类型本身不会重载运算符,并将使用它所代表的基础类型的运算符吗?

关于提升的运营商似乎没有太多关于SO的信息,所以希望这也可以帮助其他人。

2 个答案:

答案 0 :(得分:104)

提升运算符是通过“提升”已经存在于非可空形式上的运算符来处理可空类型的运算符。例如,如果你这样做:

int? x = 10;
int? y = 10;
int? z = x + y;

解除“+”运算符。它实际上并不存在于Nullable<int>上,但C#编译器就像它一样,生成代码来做正确的事情。 (在大多数情况下,这是检查任一操作数是否为null;如果是,则结果为null。否则,将两个操作数展开为其非可空值,使用普通运算符,然后将结果包装回可以通过比较来解决一些特殊情况。)

有关详细信息,请参见C# spec的第6.4.2节(提升的转换运算符)和第7.3.7节(提升的运算符)。

答案 1 :(得分:0)

提升的运算符允许将可用于非可空类型的预定义和用户定义运算符也用于其可空形式。

int i = 5;
int? j = 6;

int? k = j + i;    // 11
int? q = i + null; // null - Shows a warning the result of the expression is always null of type int?
int r = i + null; // Throws an error the result of expression is always null of type int?