0

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

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

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

编辑:我知道如何修复编译器错误(只是强制转换BCto A),我的问题是:为什么编译器不能理解类型A本身?

4

1 回答 1

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

于 2013-10-19T09:25:02.303 回答