2011-06-11 70 views
0

我收到以下錯誤如何管理C#泛型類,其中類型是基類的容器?

爲`System.Collections.Generic.List>。新增(myContainer中)」的最佳重載的方法匹配具有一些無效參數(CS1502)(GenericsTest)

對於下面的類:

A和B是MyBase的子類。

public class GenericConstraintsTest 
{ 

    private MyList<MyContainer<MyBase>> myList = new MyList<MyContainer<MyBase>>(); 

    public GenericConstraintsTest() 
    { 
     MyContainer<A> ca = new MyContainer<A>(new A()); 

     this.Add<A>(new A()); 
     this.Add<B>(new B()); 
    } 


    public void Add<S> (S value) where S : MyBase 
    { 
     MyContainer<S> cs = new MyContainer<S>(value); 
     myList.Add(cs);  
    } 


    public static void Main() 
    { 
     GenericConstraintsTest gct = new GenericConstraintsTest(); 
    } 
} 

我在做什麼錯?

乾杯

回答

6

您正在試圖調用myList.Add分別與MyContainer<A>MyContainer<B>。既不能轉換爲MyContainer<MyBase>,因爲具有不同泛型類型參數的兩個泛型實例始終不相關,即使類型參數是相關的。

做到這一點的唯一方法是製作一個IMyContainer<out T>協變通用接口。這將允許你投IMyContainer<A>IMyContainer<MyBase>如果A派生自MyBase。 (注意:只有接口可以具有協變和逆變類型參數,並且這僅在.Net 4中可用)。

例如:

public interface IMyContainer<out T> { } 
public class MyContainer<T> : IMyContainer<T> 
{ 
    public MyContainer(T value) { } 
} 
public class MyBase { } 
public class A : MyBase { } 
public class B : MyBase { } 

public class GenericConstraintsTest 
{ 

    private List<IMyContainer<MyBase>> myList = new List<IMyContainer<MyBase>>(); 

    public GenericConstraintsTest() 
    { 
     MyContainer<A> ca = new MyContainer<A>(new A()); 

     this.Add<A>(new A()); 
     this.Add<B>(new B()); 
    } 


    public void Add<S>(S value) where S : MyBase 
    { 
     MyContainer<S> cs = new MyContainer<S>(value); 
     myList.Add(cs); 
    } 


    public static void Main() 
    { 
     GenericConstraintsTest gct = new GenericConstraintsTest(); 
    } 
} 
+0

+1:我的答案准確,一直到'IMyContainer'。 – 2011-06-11 04:31:42

+0

+1您應該補充說明,這僅適用於.NET4(無論隨附的C#版本如何)。 – ChrisWue 2011-06-11 07:45:01