2016-11-16 183 views
-1

我試圖完成這樣的事情。隱式轉換泛型類

public class GreatClass<A, B> 
    where A : IA 
    where B : IB, new() 
{ 
    public void Function() 
    { 
     var list = new List<A>(); 
     var obj = new B { Items = list.ToArray() }; 
    } 
} 

public interface IA 
{ 
} 

public interface IB 
{ 
    IA[] Items { get; set; } 
} 

namespace Namespace1 
{ 
    public class A : IA {} 
    public class B : IB {} 
} 

namespace Namespace2 
{ 
    public class A : IA {} 
    public class B : IB {} 
} 

所以我有兩個具有類似類的名稱空間實現相同的接口。我有兩個我想在兩個名稱空間的類之間共享的邏輯,因此我使用實現已實現接口的泛型類。

但是,我在「list.ToArray()」上得到一個編譯錯誤,指出它不能隱式輸入'IA []'到'IA []'。有什麼我可以做的,這使得編譯器明白如何處理這個問題?

使用.Cast()像你一些人一直建議給我一個運行時錯誤,而不是。我無法將IA []類型轉換爲Namespace1.A [](或Namespace2.A [])。

+0

你可以用'.Cast ()'雖然因爲數組是空的,你可以只創建一個空的'IA []'直接。 – Lee

回答

1

有幾個選項,但最好的一個是大力鍵入您B類,並使它通用。

這是要做的代碼。請注意,TA是您傳入的A的類型,因此始終允許訪問強類型的成員。

public interface IB<TA> where TA : IA 
{ 
    TA[] Items { get; set; } 
} 

並改變GreaterClass這樣:

public class GreatClass<A, B> 
    where A : IA 
    where B : IB<A>, new() 
{ 
} 
0

簡單地聲明您的列表如下:

var list = new List<IA>(); 
+1

解釋會好嗎?這是一個很好的方法,但如果它符合OP爲什麼具有該數據結構(這從 – Liam

+0

這個問題不清楚),我認爲如果他可以控制「cast」方法是正確的方式實現。數組協變適用於引用類型和繼承層次結構。 – mtheriault

+0

我認爲這不是一個好的方法,因爲每次你想把一個項目從列表中展示給課堂外部時,你必須進行投射。 –