在C#为什么可以';t隐式转换为可为null的类型的条件运算符

在C#为什么可以';t隐式转换为可为null的类型的条件运算符,c#,conditional-operator,nullable,C#,Conditional Operator,Nullable,我很好奇为什么隐式演员在 int? someValue = SomeCondition ? ResultOfSomeCalc() : null; 为什么我必须执行显式强制转换 int? someValue = SomeCondition ? ResultofSomeCalc() : (int?)null; 在我看来,编译器拥有做出隐式强制转换决策所需的所有信息,不?C#3.0规范的相关部分是7.13,条件运算符: ?运算符的第二个和第三个操作数控制条件表达式的类型。设X和Y是第二个和第三个操

我很好奇为什么隐式演员在

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,并且编译器中的逻辑不存在将null替换为公共分母的情况

请注意,这些变体确实有效,它可能有助于您理解:

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

object someValue = true ? (int?)ResultOfSomeCalc() : null;
object someValue=true?新的可为null(ResultOfSomeCalc()):null;
对象someValue=true?(int?)resultosomecalc():null;

希望这能有所帮助。

如果函数resultofomecalc()返回int,请参见?这样就行了

如果函数返回int,则编译器将发出警告: 无法确定条件表达式的类型,因为“int”和“”之间没有隐式转换
我猜这就是你看到的。条件运算符“?:”中的两个表达式必须具有相同的类型,或者必须通过隐式转换转换为相同的类型


将ResultOfSomeCalc的返回类型更改为int?,否则您将需要对空表达式进行强制转换。

这似乎是编译器应该能够自行解决的问题,但还有一种方法可以做到这一点,使用默认关键字。它可能比演员们的丑陋程度要小一些:

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

默认值的这种用法似乎没有很好的文档记录,但它确实有效。至少它使您不必在代码中乱扔魔法值(我认为null/zero/false/等确实是魔法值)

将函数resultofomecalc()的返回类型设置为nullabel int like(int?)

智力?someValue=(int?)SomeCondition?ResultofSomeCalc():(int?)null

总之,它不考虑您在操作结果中分配给的类型。它只是试图找出方程类型的右侧——忽略可空类型。但是让我们考虑三元链的情况。不然它怎么知道?@DJ Floetic:它会从“最里面的”开始?:操作符,找出结果的类型,然后找出它的出路。如果每个结果都可以隐式转换为另一个呢?哇,这是一个多么糟糕的问题。我不会亲自编辑你的标题,但是我建议你把terrnary这个词改成conditional,这个操作符叫做conditional操作符。它是一个三元运算符,目前是唯一的一个,但除了操作数之外,它没有描述任何东西。也许我更厚颜无耻,但我会…@MarcGravel我厚颜无耻,希望是正确的-标题不应该是
**条件运算符
@PhilippM我认为在上下文中很明显,它的意思是“的一个实例”,所以(承包)“a”感觉很好