为什么c#编译器不能在下面的代码中推断出条件表达式的类型?
class A {}
class B : A {}
class C : A {}
A TestInference ()
{
return new Random ().Next () == 0 ? new B () : new C ();
}
编辑:我知道如何解决编译器错误(只是将B
或C
强制转换为A
),我的问题是:为什么编译器无法理解类型本身是A
吗?
答案 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
?