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