爲什麼c#編譯器不能推斷下面代碼中條件表達式的類型?條件運算符類型推斷
class A {}
class B : A {}
class C : A {}
A TestInference()
{
return new Random().Next() == 0 ? new B() : new C();
}
編輯:我知道如何修復編譯器錯誤(只投了B
或C
到A
),我的問題是:爲什麼不能編譯器知道該類型是A
本身?
爲什麼c#編譯器不能推斷下面代碼中條件表達式的類型?條件運算符類型推斷
class A {}
class B : A {}
class C : A {}
A TestInference()
{
return new Random().Next() == 0 ? new B() : new C();
}
編輯:我知道如何修復編譯器錯誤(只投了B
或C
到A
),我的問題是:爲什麼不能編譯器知道該類型是A
本身?
從文檔:
要麼first_expression和second_expression的類型必須是相同的,或 隱式轉換必須存在從一種類型到另一個。
在你的情況下,沒有隱式轉換,但如果你將其中的一個投到A
它應該工作。正如Steve發佈的第一個鏈接中所解釋的那樣,實際上有一些很好的理由不會這麼做。但是,有人可能會爭辯說它應該能夠自己弄清楚,但實際上有一些很好的理由不這麼做。
考慮以下情況:
interface D {}
class A {}
class B : A, D {}
class C : A, D {}
var x = condition ? new B() : new C();
如果編譯器讓x
的A
或D
?
請參閱本SO討論中提到的http://blogs.msdn.com/b/ericlippert/archive/2006/05/24/type-inference-woes-part-one-as.aspx:http:// stackoverflow .com/questions/14144131/understanding -c-sharp-compilation-error-with-ternary-operator –
@Steve謝謝。我將這個標記爲你鏈接的那個的重複 – miniBill