我很好奇为什么隐式演员会失败...
int? someValue = SomeCondition ? ResultOfSomeCalc() : null;
为什么我必须执行显式演员
int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;
在我看来,编译器具有进行隐式转换决策所需的所有信息,不是吗?
C#3.0规范的相关部分是7.13,条件运算符:
?:运算符的第二个和第三个操作数控制条件表达式的类型.设X和Y是第二个和第三个操作数的类型.然后,
如果X和Y是相同的类型,那么这是条件的类型否则,如果从X到Y存在隐式转换(第6.1节),而不是从Y到X,则Y是条件表达式的类型.否则,如果从Y到X存在隐式转换(第6.1节),而不是从X到Y,则X是条件表达式的类型.否则,无法确定表达式类型,并发生编译时错误.
我也很生气,它不能根据赋值推断出类型,特别是当它是一个值类型时.当你进入对象层次时,有一些原因.
如果"ResultOfSomeCalc()"返回"int?",那么这将起作用.无论赋值的左边是什么,C#都需要弄清楚类型.所以你告诉它你将返回一个null或一个int - 并且编译器中的逻辑不存在以使它将Nullable替换为公分母.
请注意,这些变体可以正常工作,它可以帮助您理解:
object someValue = true ? new Nullable(ResultOfSomeCalc()) : null; object someValue = true ? (int?)ResultOfSomeCalc() : null;
希望这可以帮助.
看起来这似乎是编译器应该能够自己解决的问题,但还有另外一种方法可以使用default关键字.它可能是最小的比演员更丑陋:
int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);
这种默认使用似乎没有很好地记录,但确实有效.至少它可以让你不必使用魔术值乱丢你的代码(我认为null/zero/false/etc确实是魔术值).