【问题标题】:What are lifted operators?什么是提升运算符?
【发布时间】:2011-03-23 03:46:09
【问题描述】:

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

谁能解释提升的运算符以及可空类型如何使用它们?这是否意味着可空类型本身不会重载运算符,而是会使用它所代表的底层类型中的运算符?

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

【问题讨论】:

  • 啊.. 以为 (null >> 1) 无效,想知道为什么会这样?似乎在 (int? x = null;(x >> 1) ?? -1;) 的第二个语句中对 x 进行操作。认为 ??将其“转换”为有效形式 ((x == null) ? -1: (x >> 1);)。原来它是在 (x >> 1) 上运行的,并且 (null >> 1) 是有效的。

标签: c# .net nullable lifted-operators


【解决方案1】:

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

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

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

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

【讨论】:

  • 这个答案并没有说明“正确的事情”实际上是什么,我认为这是提升运算符如何工作的最重要方面。
  • @JonSkeet:您的链接指向 C# 5 规范;您的意思是在这里说 5 还是链接到 4 规范?
  • @Cᴏʀʏ:当我链接到它时,它是 C# 4 规范,但现在该链接转到 C# 5 规范……几个月后它可能是 C# 6 规范 :)
  • @JonSkeet:我想这并不重要,这个答案,无论哪个规范,都应该在很长一段时间内相关。
【解决方案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?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2012-05-11
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多