条件运算符不适用于继承相同基类型的两种类型

Jam*_*xon 12 c# asp.net-mvc conditional-operator

?:当与从单个基类型继承的两种类型一起使用时,条件运算符()如何不起作用?

我的例子是:

ActionResult foo = (someCondition)? 
                      RedirectToAction("Foo","Bar") :
                      Redirect(someUrl);
Run Code Online (Sandbox Code Playgroud)

长形式可以正常工作:

ActionResult foo;

if(someCondition)
{
  foo = RedirectToAction("Foo","Bar");
}
else
{
  foo = Redirect(someUrl);
}
Run Code Online (Sandbox Code Playgroud)

两种返回类型,RedirectToRouteResult 并且RedirectResult继承自ActionResult.

Jon*_*eet 16

为什么条件运算符(?:)与从单个基类型继承的两种类型一起使用时不起作用?

的类型,条件表达式必须是任一所述第二操作数的类型所述第三操作数的类型,按照语言规范.编译器不会尝试查找公共基类型,也不会尝试将两个操作数都转换为其他类型.表达式的使用不会影响其类型的确定方式 - 因此变量赋值在此处无关紧要.

至于为什么语言被定义为这样 - 它使得指定,实现,测试和预测变得相当简单.这在语言设计中相当普遍 - 从长远来看,保持语言简单通常是更好的选择,即使它在某些特定情况下使其稍微尴尬.

有关详细信息,请参阅C#4规范的第7.14节.

将第二个或第三个操作数转换为您实际需要的条件表达式类型是解决问题的方法.请注意,这种情况经常出现的另一种情况是可空类型:

// Invalid
int? a = SomeCondition ? null : 10;

// All valid
int? a = SomeCondition ? (int?) null : 10;
int? b = SomeCondition ? default(int?) : 10;
int? c = SomeCondition ? null : (int?) 10;
Run Code Online (Sandbox Code Playgroud)