2013-01-10 1 views
-5

여기 내 원래 스레드 : 내 읽기 전용 인터페이스에 C# generic inheritance and covarianceC#을 일반 상속과 공분산 부분은 2

, 나는이 상속 작업 할.

IReadOnlyCollection<String> s; 
IReadOnlyCollection<Object> o = s; 
+0

BTW,'ItemType'은 'T'라고해야합니다. – SLaks

+0

'CopyToArray'가'Array'를 반환하는 대신'ItemType []'을 반환하도록 강하게 입력됩니다. – Servy

+2

이 질문에는 어떤 질문도 나타나지 않습니다. "나는 상속을 원한다"는 질문이 아닙니다. 대답을 원하면 질문으로 다시 작성하십시오. 컴파일러가 정확합니다. 이 코드는 타입 안전하지 않습니다. –

답변

5

이 질문에 질문이있을 나타나지 않는, 그래서 : 그것은 P는 컴파일 된 경우를 제외하고이 같이

public delegate Boolean EnumerateItemsDelegate<out ItemType>(ItemType item); 

public interface IReadOnlyCollection<out ItemType> 
{ 
    Boolean ContainsItem(ItemType item); 
    Array CopyToArray(); 
    void EnumerateItems(EnumerateItemsDelegate<ItemType> enumerateDelegate); 

    UInt32 Count { get; } 
    UInt32 Capacity { get; } 
} 

이것은 내가 일하고 싶습니다 것입니다 대답 할 몇 가지 질문을 작성합니다.

공변량 변환이란 무엇입니까?

의 우리가 어떤 종류의 Fruit과 분명한 관계 AppleBanana이 있다고 가정하자; Apple은 일종의 Fruit입니다.

공변 변환은 형식 인수의 변환 가능성이 제네릭 형식의 변환 가능성을 의미하는 경우입니다. Apple 경우 Fruit로 전환하고, Bowl<Apple>Bowl<T>


contravariant 변환은 무엇입니까 T.

에 공변되어 다음 Bowl<Fruit>로 변환입니까?

contravariant 변환 을 보존 방향 대신 반전하는 공변 변환이다. Eater<Fruit> 다음 Eater<Apple>로 전환하는 경우 나는 그것의 형식 매개 변수의 공변 또는 contravariant되는 등의 인터페이스 또는 대리자를 표시하려면 어떻게 Eater<T>


T.

에서 contravariant입니까?

공변량 매개 변수는 out으로 표시되고 반공 변수 매개 변수는 in으로 표시됩니다.

이것은 일]적인 것입니다. 공변 인터페이스는 일] 적으로 출력 매개 변수에 출력 매개 변수를 표시하고 반 관통 인터페이스에는 입력 매개 변 수에 유형 매개 변수가 표시됩니다.


StringObject로 변환합니다. IReadOnlyCollection<String>IReadOnlyCollection<Object>으로 변환하려면 어떻게해야하나요?

IReadOnlyCollection<T>을 T로 공분산하십시오. out으로 표시하십시오.

delegate void Action<in T>(T t); 
interface IFoo<in X> 
{ 
    void M(Action<X> action); 
} 

왜 컴파일러이이 유효하지 않다는 :


다음 코드를 고려?

유효하지 않기 때문에. 왜 보는지 보자.

class Foo : IFoo<Fruit> 
{ 
    public void M(Action<Fruit> action) 
    { 
    action(new Apple()); // An apple is a fruit. 
    } 
} 
... 
IFoo<Fruit> iff = new Foo(); 
IFoo<Banana> ifb = iff; // Contravariant! 
ifb.M(banana => { banana.Peel(); }); 

논리를 따릅니다. 이 프로그램은 사과를 "this"of Banana.Peel()으로 전달합니다. 이것은 분명히 잘못되었습니다.

컴파일러는 이러한 일이 발생할 수 있음을 알고 있으므로 처음부터 인터페이스를 선언 할 수 없습니다. 내가 분산에 대한 자세한 문의 사항이있을 경우


는 어떻게해야합니까?

필자는 기능의 설계 및 구현에 관한 기사를 읽어야합니다. 아래쪽부터 시작하십시오. 그들은 반대 순으로 나열됩니다

http://blogs.msdn.com/b/ericlippert/archive/tags/covariance+and+contravariance/

당신은 여전히 ​​당신 대신에 사람들이 질문은 정말 무엇인지 추측 만드는, 실제로 질문을 포함하는 여기에 질문을 게시해야 질문이있는 경우.

+0

당신 말이 맞아요. 지금은 ContainsItem이 레퍼런스 타입이라면 타입을 신경 쓰지 않는다고 컴파일러에게 말하고 싶습니다. –

+0

@RyanBrown 위의 코멘트를 참조하십시오. 컴파일러에게'ContainsItem' 메쏘드에 대한 매개 변수의 타입에 대해 "신경 쓰지 않는다"고 알려주기 위해서, 다음과 같이'ItemType'을 상속받은 새로운 제네릭 타입으로 만드십시오 :'bool ContainsItem (T item) T : ItemType;'. – jam40jeff