我有这个奇怪的代码(永远不会在生产代码中使用)产生奇怪的编译错误,我想知道更多关于这种行为,
string MyMethod(string s)
{
return s == null ? null : null;
}
我得到的错误是:
无法确定条件表达式的类型,因为
null
和null
之间没有隐式转换
是什么解释了这种行为?
答案 0 :(得分:9)
是什么解释了这种行为?
C#5规范,第7.14节:
?:运算符的第二个和第三个操作数x和y控制条件表达式的类型。
- 如果x的类型为X且y的类型为Y,那么[...]
- 如果x和y中只有一个具有类型,并且x和y都可以隐式转换为该类型,那么这就是条件表达式的类型。
- 否则,无法确定表达式类型,并发生编译时错误。
您的情况是这些选项中的最后一个 - 表达式null
没有类型,因此x
和y
都没有类型,因此您会收到编译时错误。< / p>
您尝试使用条件运算符表达式的结果的事实与表达式的类型无关 - 编译器的工作原理是“从里到外” - 它找到表达式的类型,然后检查您对它的使用是否正确。
在这种情况下, 没有类型,因此编译失败。
在C#1中,有一个“null类型”被认为是null
文字的类型 - 但是这个概念在C#3规范中被删除了。 (MS没有完整的C#2规范;它只是C#2规范的一组补充。)
答案 1 :(得分:2)
条件运算符需要根据第二个和第三个操作数的类型确定其结果的类型。 null
没有类型,因此条件运算符无法确定其值将解析的类型。
答案 2 :(得分:1)
我怀疑编译器会感到困惑,因为它无法确定返回的是什么类型。仅基于它null
的信息,它可以是任何引用类型。
要解决此问题,请将null
中的一个或两个投放为(string)null
,并且应该理解。
答案 3 :(得分:0)
问题是条件运算符的结果不能从这两个选项中输入,因为它们既没有指定类型也没有指定类型。解决方案可以是字符串:
string MyMethod(string s)
{
return s == null ? (string)null : null;
}
当然,也不需要这个条件,因为它总是返回null,而不是它可以是:
string MyMethod(string s)
{
return null;
}