当前位置:  开发笔记 > 编程语言 > 正文

在C#中,为什么不能将条件运算符隐式地转换为可空类型

如何解决《在C#中,为什么不能将条件运算符隐式地转换为可空类型》经验,为你挑选了3个好方法。

我很好奇为什么隐式演员会失败...

int? someValue = SomeCondition ? ResultOfSomeCalc() : null;

为什么我必须执行显式演员

int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null;

在我看来,编译器具有进行隐式转换决策所需的所有信息,不是吗?



1> Brian Liang..:

C#3.0规范的相关部分是7.13,条件运算符:

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

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


总之,它没有考虑您在操作结果中分配的类型.它只是试图找出方程类型的右侧 - 忽略了Nullable类型.

2> TheSoftwareJ..:

我也很生气,它不能根据赋值推断出类型,特别是当它是一个值类型时.当你进入对象层次时,有一些原因.

如果"ResultOfSomeCalc()"返回"int?",那么这将起作用.无论赋值的左边是什么,C#都需要弄清楚类型.所以你告诉它你将返回一个null或一个int - 并且编译器中的逻辑不存在以使它将Nullable替换为公分母.

请注意,这些变体可以正常工作,它可以帮助您理解:

object someValue = true ? new Nullable(ResultOfSomeCalc()) : null;

object someValue = true ? (int?)ResultOfSomeCalc() : null;

希望这可以帮助.



3> Mr. Putty..:

看起来这似乎是编译器应该能够自己解决的问题,但还有另外一种方法可以使用default关键字.它可能是最小的比演员更丑陋:

int? someValue = SomeCondition ? ResultofSomeCalc() : default(int?);

这种默认使用似乎没有很好地记录,但确实有效.至少它可以让你不必使用魔术值乱丢你的代码(我认为null/zero/false/etc确实是魔术值).

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有