null和null之间没有隐式转换

IEa*_*els 1 c# implicit-conversion

我有这个奇怪的代码(永远不会在生产代码中使用)产生奇怪的编译错误,我想知道更多关于这种行为,

string MyMethod(string s)
{
   return s == null ? null : null;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

无法确定条件表达式的类型,因为null和之间没有隐式转换null

什么解释了这种行为?

Jon*_*eet 9

什么解释了这种行为?

C#5规范,第7.14节:

?:运算符的第二个和第三个操作数x和y控制条件表达式的类型.

  • 如果x有X型,y有Y型,那么[...]
  • 如果x和y中只有一个具有类型,并且x和y都可以隐式转换为该类型,那么这就是条件表达式的类型.
  • 否则,无法确定表达式类型,并发生编译时错误.

你的情况是最后的这些选项-表达null没有类型,因此既没有xy有型,所以你会得到一个编译时错误.

您尝试使用条件运算符表达式的结果这一事实与表达式的类型无关 - 编译器的工作原理是"从里到外" - 它找到表达式的类型然后检查你对它的使用是正确的.

在这种情况下,没有类型,因此编译失败.

在C#1中,有一个"null类型"被认为是null文字的类型- 但是这个概念在C#3规范中被删除了.(MS没有完整的C#2规范;它只是C#2规范的一组补充.)