2011-02-14 88 views
0

我有以下的複雜的繼承層次:爲什麼這個繼承層次不允許這個賦值?

I1<I3> 
A1 : C1, I2 
C2 : A1, I3 
C3 : A2<C2>, I4     
A2<C2> : I5, I1<C2> 

以圖片形式:

Inheritance diagram

寫作:

I1<I3> i = new C3(); 

...導致編譯錯誤「無法轉換源類型...到目標類型...「。

爲什麼?

+0

I3不是一個類型,因此不能用作泛型? – CarneyCode 2011-02-14 21:32:35

回答

0

協變和逆變的泛型參數應該明確地標記爲這樣。

下面的代碼編譯沒有錯誤(注意關鍵字):

class tmp 
{ 
    class C1 {} 
    interface I2 {} 
    interface I3 {} 
    interface I4 {} 
    interface I5 {} 
    interface I1<out I3> {} 
    class A1 : C1, I2 {} 
    class C2 : A1, I3 {} 
    class C3 : A2<C2>, I4 {} 
    class A2<C2> : I5, I1<C2> { } 

    private void Main() 
    { 
     I1<I3> i = new C3(); 
    } 
} 

當然,不脫離如你描述它失敗相同的錯誤消息的關鍵字。

相關問題