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