내 코드의 조각입니다해야합니다. 는 "매개 변수가 입력 안전해야 잘못된 분산 : 유형 매개 변수는 | TInput는 | "> T에서 IB <"에 contravariantly 유효해야합니다매개 변수 입력 안전 여기에 오류
어떤 도움을 이해할 수있을 것이다
내 코드의 조각입니다해야합니다. 는 "매개 변수가 입력 안전해야 잘못된 분산 : 유형 매개 변수는 | TInput는 | "> T에서 IB <"에 contravariantly 유효해야합니다매개 변수 입력 안전 여기에 오류
어떤 도움을 이해할 수있을 것이다
C#에서 contravariance의 지정자 (예 in
를)에서만 즉시 수준에서 직관적이다.. , 당신이 막을 때 e 제네릭 형식의 매개 변수를 "가져 오는"메서드입니다. 그러나 내부적으로 반 차란 반전 (Q&A with an explanation)이므로 in
안에 IA
을 사용하면 IB
과 호환되지 않습니다.
문제는 예제를 통해 가장 잘 설명됩니다. 클래스 Animal
및 파생 클래스 Tiger
을 고려하십시오. ,
class A_Impl<T> : IA<T> {
T data;
public void Method(IB<TInput> entities) {
entities.MethodB(data);
}
}
IA<in TInput>
을 선언하고 IB<in TInput>
당신이
IA<Animal> aForAnimals = new A_Impl<Animal>();
IA<Tiger> aForTigers = aForAnimals;
IA<in TInput>
이 IB<TInput>
를 취하는 방법을 가지고 할 수 있다는 것을 의미한다 : 또한 IB<T>
이 IA
의 Method
에서 호출하는 방법 void MethodB(T input)
을 가지고 있다고 가정하자 우리는 이것을 다음과 같이 부를 수 있습니다 :
aForTigers.Method(new B_Impl<Tiger>());
A_Impl<Animal>
은 을 예상하는 인터페이스의 MethodB
에 Animal
을 전달하므로 문제가됩니다.
당신은하지만, IB<out T>
으로 아무런 문제가 없을 것 - 모두 공분산 및 contravariance로 :
public interface IB<out T> {
// ^^^
}
// This works
public interface IA<in TInput> {
void Method(IB<TInput> x);
}
// This works too
public interface IC<out TInput> {
void Method(IB<TInput> x);
}