Null合并运算符结果的隐式强制转换

本文关键字:转换 合并 运算符 结果 Null | 更新日期: 2023-09-27 18:20:46

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

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

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

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

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

谢谢你的关心。

Null合并运算符结果的隐式强制转换

要使第二种情况适用于三元运算符,可以使用以下内容:

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

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

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

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

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

您观察到的空合并运算符??的这种行为是一种有文档记录的语言特性,有关更多详细信息,请参阅C#4.0语言规范的7.13节。

表达式的类型a??b取决于哪个隐含可对操作数进行转换。按照偏好的顺序类型??b是A0、A或b,其中A是A的类型(前提是a具有类型),B是B的类型(前提是B具有类型)和A0如果A是可为null的类型,则为A的基础类型,否则为A。具体来说,a??b处理如下:

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

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

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

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

  • 否则,如果b的类型为b,并且存在从a到b的隐式转换,则结果类型为b。在运行时,首先计算a。如果不为null,则将a展开为类型A0(如果a存在并且可以为null)并转换为类型B并且这成为结果。否则,b为评估并成为结果。

  • 否则,a和b不兼容,并且会发生编译时错误。

有关条件运算符a ? b : c工作方式不同的原因,请参见第7.14节。

下载规范,以便在空闲时完整阅读。

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

在第二种情况下,你的情况很复杂——你可能是指

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

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

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

更简洁的解释:

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