0
我有以下的複雜的繼承層次:爲什麼這個繼承層次不允許這個賦值?
I1<I3>
A1 : C1, I2
C2 : A1, I3
C3 : A2<C2>, I4
A2<C2> : I5, I1<C2>
以圖片形式:
寫作:
I1<I3> i = new C3();
...導致編譯錯誤「無法轉換源類型...到目標類型...「。
爲什麼?
我有以下的複雜的繼承層次:爲什麼這個繼承層次不允許這個賦值?
I1<I3>
A1 : C1, I2
C2 : A1, I3
C3 : A2<C2>, I4
A2<C2> : I5, I1<C2>
以圖片形式:
寫作:
I1<I3> i = new C3();
...導致編譯錯誤「無法轉換源類型...到目標類型...「。
爲什麼?
協變和逆變的泛型參數應該明確地標記爲這樣。
下面的代碼編譯沒有錯誤(注意出關鍵字):
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();
}
}
當然,不脫離如你描述它失敗相同的錯誤消息的出關鍵字。
I3不是一個類型,因此不能用作泛型? – CarneyCode 2011-02-14 21:32:35