2016-08-16 9 views
2

내 코드의 조각입니다해야합니다. 는 "매개 변수가 입력 안전해야 잘못된 분산 : 유형 매개 변수는 | TInput는 | "> T에서 IB <"에 contravariantly 유효해야합니다매개 변수 입력 안전 여기에 오류

어떤 도움을 이해할 수있을 것이다

답변

1

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>IAMethod에서 호출하는 방법 void MethodB(T input)을 가지고 있다고 가정하자 우리는 이것을 다음과 같이 부를 수 있습니다 :

aForTigers.Method(new B_Impl<Tiger>()); 

A_Impl<Animal>은 을 예상하는 인터페이스의 MethodBAnimal을 전달하므로 문제가됩니다.

당신은하지만, 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); 
}