2013-10-19 51 views
0

爲什麼c#編譯器不能推斷下面代碼中條件表達式的類型?條件運算符類型推斷

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

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

編輯:我知道如何修復編譯器錯誤(只投了BCA),我的問題是:爲什麼不能編譯器知道該類型是A本身?

+2

請參閱本SO討論中提到的http://blogs.msdn.com/b/ericlippert/archive/2006/05/24/type-in​​ference-woes-part-one-as.aspx:http:// stackoverflow .com/questions/14144131/understanding -c-sharp-compilation-error-with-ternary-operator –

+0

@Steve謝謝。我將這個標記爲你鏈接的那個的重複 – miniBill

回答

3

從文檔:

要麼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(); 

如果編譯器讓xAD

+0

是的,那是我的觀點... – miniBill

+0

猜測答案是它是C#團隊的設計決定。 – Chris

+0

「實際上有一些很好的理由不會這樣做,正如Steve在其中發佈的第一個鏈接中所解釋的那樣:」不,沒有很好的理由,也沒有任何討論。給出的唯一理由是「我們不想進入企業......」。其他語言,比如Scala,可以做更多更廣泛的類型推斷,沒有任何問題。 –