68

我正在看这篇文章,并且正在努力遵循解释提升运算符的 VB.NET 示例。似乎没有等效的 C# 示例或教程。一般来说,我在运算符重载方面没有太多经验,因此在阅读可空类型的同时尝试与 VB.NET 等价物达成协议可能不是最好的起点......

任何人都可以提供对提升运算符的解释以及它们是如何被可空类型使用的吗?这是否只是意味着可空类型本身不会重载运算符,而是会使用它所代表的基础类型中的运算符?

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

4

2 回答 2

130

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

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

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

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

于 2010-07-30T09:19:41.680 回答
2

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

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?
于 2019-05-04T04:53:53.200 回答