6

对 C# 中的空合并运算符 (??) 有了以下理解。

int? input = -10;
int result = input ?? 10;//Case - I
//is same as:
int result = input == null? input : 10; // Case - II

而根据定义和用法,案例 I 和案例 II 是相同的。

令人惊讶的是,在 Case-I 中编译器能够隐式转换 int? 到 int 而在 Case-II 中它显示错误:'错误 1 ​​无法隐式转换类型'int?' 'int'"

关于空合并运算符,我缺少什么?

感谢您的关注。

4

4 回答 4

5

要使第二种情况与三元运算符一起使用,您可以使用以下内容:

int result = input != null ? input.Value : 10;

该类型的Value属性Nullable<T>返回T值(在本例中为int)。

另一种选择是使用Nullable<T>.HasValue

int result = input.HasValue ? input.Value : 10;

myNullableInt != null构造只是上述HasValue调用的语法糖。

于 2012-01-17T16:36:51.797 回答
5

您对 null-coalescing 运算符观察到的这种行为??是记录在案的语言功能,有关更多详细信息,请参阅 C# 4.0 语言规范的第 7.13 节。

表达式的类型 a ?? b 取决于操作数上可用的隐式转换。按优先顺序,a 的类型??b 是 A0、A 或 B,其中 A 是 a 的类型(前提是 a 有类型),B 是 b 的类型(前提是 b 有类型),如果 A是可空类型,否则为 A。具体来说,一个?? b 处理如下:

  • 如果 A 存在并且不是可空类型或引用类型,则会发生编译时错误。

  • 如果 b 是动态表达式,则结果类型是动态的。在运行时,首先评估 a。如果 a 不为 null,则将 a 转换为动态,这将成为结果。否则,评估 b,这将成为结果。

  • 否则,如果 A 存在并且是可空类型并且存在从 b 到 A0 的隐式转换,则结果类型为 A0。在运行时,首先评估 a。如果 a 不为 null,则将 a 解包为类型 A0,这将成为结果。否则,b 被求值并转换为 A0 类型,这成为结果。

  • 否则,如果存在 A 并且存在从 b 到 A 的隐式转换,则结果类型为 A。在运行时,首先评估 a。如果 a 不为空,则 a 成为结果。否则,b 被评估并转换为类型 A,这成为结果。

  • 否则,如果 b 具有 B 类型并且存在从 a 到 B 的隐式转换,则结果类型为 B。在运行时,首先计算 a。如果 a 不为空,则将 a 解包为 A0 类型(如果 A 存在且可为空)并转换为 B 类型,这将成为结果。否则, b 被评估并成为结果。

  • 否则,a 和 b 不兼容,并出现编译时错误。

请参阅第 7.14 节了解为什么条件运算符的a ? b : c工作方式不同。

下载规范以在您的空闲时间完整阅读。

于 2012-01-17T16:38:32.273 回答
0
int result = input == null ? input : 10;

在第二种情况下,您的情况很复杂-您可能的意思是

int result = input != null ? input : 10;

现在这不会编译,因为与三元运算符一起使用的两种类型必须完全相同(并且int?与 不同int) - 您可以使用简单的强制转换作为解决方案:

int result = input != null ? (int)input : 10;
于 2012-01-17T16:40:26.793 回答
-1

更简洁的解释:

int? NULL_Int = 1;
int NORM_Int = 2;

NULL_Int = NORM_Int;  // OK

NORM_Int = NULL_Int;  // NO, you can't assign a null to an int
于 2012-01-17T16:44:05.247 回答