条件运算符类型推断

时间:2013-10-19 09:18:48

标签: c# type-inference conditional-operator

为什么c#编译器不能在下面的代码中推断出条件表达式的类型?

class A {}
class B : A {}
class C : A {}

A TestInference ()
{
    return new Random ().Next () == 0 ? new B () : new C ();
}

编辑:我知道如何解决编译器错误(只是将BC强制转换为A),我的问题是:为什么编译器无法理解类型本身是A吗?

1 个答案:

答案 0 :(得分:3)

来自文档:

  

first_expression和second_expression的类型必须相同,或者是   隐式转换必须存在于一种类型之间。

在你的情况下,没有隐式转换,但如果你将其中一个转换为A它应该有效。

但是,是的,有人可能会说它本身应该能够弄明白,但实际上有一些很好的理由让它不这样做,正如史蒂夫发布的第一个链接所解释的那样。

考虑以下情况:

interface D {}
class A {}
class B : A, D {}
class C : A, D {}

var x = condition ? new B() : new C();

编译器应该使x成为A还是D

相关问题