여기 내 원래 스레드 : 내 읽기 전용 인터페이스에 C# generic inheritance and covarianceC#을 일반 상속과 공분산 부분은 2
, 나는이 상속 작업 할.
IReadOnlyCollection<String> s;
IReadOnlyCollection<Object> o = s;
여기 내 원래 스레드 : 내 읽기 전용 인터페이스에 C# generic inheritance and covarianceC#을 일반 상속과 공분산 부분은 2
, 나는이 상속 작업 할.
IReadOnlyCollection<String> s;
IReadOnlyCollection<Object> o = s;
이 질문에 질문이있을 나타나지 않는, 그래서 : 그것은 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
과 분명한 관계 Apple
및 Banana
이 있다고 가정하자; Apple
은 일종의 Fruit
입니다.
공변 변환은 형식 인수의 변환 가능성이 제네릭 형식의 변환 가능성을 의미하는 경우입니다. Apple
경우 Fruit
로 전환하고, Bowl<Apple>
는 Bowl<T>
가
contravariant 변환은 무엇입니까 T.
에 공변되어 다음Bowl<Fruit>
로 변환입니까?
contravariant 변환 는을 보존 방향 대신 반전하는 공변 변환이다. Eater<Fruit>
다음 Eater<Apple>
로 전환하는 경우 나는 그것의 형식 매개 변수의 공변 또는 contravariant되는 등의 인터페이스 또는 대리자를 표시하려면 어떻게 Eater<T>
는
T.
에서 contravariant입니까?
공변량 매개 변수는 out
으로 표시되고 반공 변수 매개 변수는 in
으로 표시됩니다.
이것은 일]적인 것입니다. 공변 인터페이스는 일] 적으로 출력 매개 변수에 출력 매개 변수를 표시하고 반 관통 인터페이스에는 입력 매개 변 수에 유형 매개 변수가 표시됩니다.
String
는Object
로 변환합니다.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/
당신은 여전히 당신 대신에 사람들이 질문은 정말 무엇인지 추측 만드는, 실제로 질문을 포함하는 여기에 질문을 게시해야 질문이있는 경우.
당신 말이 맞아요. 지금은 ContainsItem이 레퍼런스 타입이라면 타입을 신경 쓰지 않는다고 컴파일러에게 말하고 싶습니다. –
@RyanBrown 위의 코멘트를 참조하십시오. 컴파일러에게'ContainsItem' 메쏘드에 대한 매개 변수의 타입에 대해 "신경 쓰지 않는다"고 알려주기 위해서, 다음과 같이'ItemType'을 상속받은 새로운 제네릭 타입으로 만드십시오 :'bool ContainsItem (T item) T : ItemType;'. – jam40jeff
BTW,'ItemType'은 'T'라고해야합니다. – SLaks
'CopyToArray'가'Array'를 반환하는 대신'ItemType []'을 반환하도록 강하게 입력됩니다. – Servy
이 질문에는 어떤 질문도 나타나지 않습니다. "나는 상속을 원한다"는 질문이 아닙니다. 대답을 원하면 질문으로 다시 작성하십시오. 컴파일러가 정확합니다. 이 코드는 타입 안전하지 않습니다. –