为什么null需要显式类型转换?

Blu*_*eft 21 .net c# null casting

以下代码无法编译:

//int a = ...
int? b = (int?) (a != 0 ? a : null);
Run Code Online (Sandbox Code Playgroud)

为了编译,需要将其更改为

int? b = (a != 0 ? a : (int?) null);
Run Code Online (Sandbox Code Playgroud)

由于这两个b = nullb = a是合法的,这是没有意义的我.

为什么我们不得不强制null转换为一个int?为什么我们不能简单地为整个表达式提供一个显式类型转换(我知道在其他情况下可能)?

Han*_*ant 18

从C#语言规范的第7.13章开始:

?:运算符的第二个和第三个操作数控制条件表达式的类型.设X和Y是第二个和第三个操作数的类型.然后,

  • 如果X和Y是相同的类型,那么这是条件表达式的类型.
  • 否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型.
  • 否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型.
  • 否则,无法确定表达式类型,并发生编译时错误.

在您的情况下,没有从int到null的隐式转换,反之亦然.你的演员解决了这个问题,int可以转换为int吗?


Vla*_*lad 5

?:运算符的两种选择必须属于同一类型.否则,编译器无法推断出整个条件表达式的类型.

null不是int,所以你需要给编译器一个提示结果类型int?.


编辑:正如其他人指出的那样,这两种类型不需要相同,但其中一种应该可以转换为另一种(另一种将是结果类型).有关详细信息,请参阅规格.


sta*_*son 5

如果您使用default(int?)而不是,您可以避免投射null.

int a = 42;
int? b = (a != 0 ? a : default(int?));
Run Code Online (Sandbox Code Playgroud)