2011-06-11 2 views
0

나는 다음과 같은 오류를 얻을타입이 기본 클래스의 컨테이너 인 C# Generics 클래스는 어떻게 관리합니까?

`System.Collections.Generic.List> .Add (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

당신은 각각 MyContainer<A>MyContainer<B>myList.Add를 호출하려고합니다. 형식 매개 변수가 관련되어 있어도 서로 다른 제네릭 형식 매개 변수를 사용하는 두 가지 일반적인 인스턴스화는 항상 관련이 없기 때문에 컨버터블은 MyContainer<MyBase>으로 변환 할 수 없습니다.

이 작업을 수행하는 유일한 방법은 IMyContainer<out T> 공변량 일반 인터페이스를 만드는 것입니다. 이 경우 AMyBase에서 파생 된 경우 IMyContainer<A>IMyContainer<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' 정확히 내 대답. –

+0

+1 .NET4에서만 사용할 수 있다는 것을 추가해야합니다 (C# 버전과 함께 제공됨). – ChrisWue

관련 문제