什么是提升运算符?

70

我正在查看这篇文章,但在理解解释提升运算符的VB.NET示例时遇到了困难。似乎没有等价的C#示例或教程。我对一般情况下的操作符重载没有太多经验,因此在阅读空值类型的相关内容时,试图理解VB.NET版本并不是最好的开始...

有谁能够解释一下提升运算符以及它们如何被空值类型使用吗?这是否意味着空值类型本身不会重载运算符,并将使用所表示的基础类型的运算符?

关于提升运算符的信息似乎在SO上很少,因此希望这可以帮助其他人。


啊..以为(null >> 1)是无效的,所以不明白为什么在(int? x = null;(x >> 1) ?? -1;)的第二个语句中,??似乎是对x进行操作。原以为??会将它转换为有效形式((x == null)?-1:(x>>1))。结果发现它是在(x >> 1)上操作的,而(null >> 1)是有效的。 - blizpasta
2个回答

137

提升操作符是指通过将操作符“提升”到非空类型中已经存在的操作符上,从而在可空类型上运行的操作符。因此例如,如果您执行以下操作:

int? x = 10;
int? y = 10;
int? z = x + y;
那个“+”操作符被提升了。在Nullable<int>上它实际上并不存在,但C#编译器会假装它存在,并生成相应的代码来完成操作。(对于大多数情况而言,这涉及到检查是否有任一操作数为null;如果是,结果就是null。否则,将两个操作数解包为非nullable值,使用正常的操作符,然后将结果重新封装回可空类型。不过,在比较方面还有一些特殊情况。)
更多信息请参见C#规范第6.4.2节(提升转换运算符)和第7.3.7节(提升操作符)。

9
这个答案没有明确说明“正确的事情”具体是什么,而我认为这是提升运算符如何工作的最重要方面。 - Ani
@JonSkeet:你的链接指向C# 5规范;你是想说这里是5,还是链接到4规范? - Cᴏʀʏ
2
@Cᴏʀʏ:我链接的是C# 4规范,但现在该链接已经指向了C# 5规范...也许几个月后会是C# 6规范 :) - Jon Skeet
@JonSkeet:我想无论如何都没关系,这个答案,无论哪个规范,都应该长期相关。 - Cᴏʀʏ

3

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

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?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接