El parámetro debe ser error de entrada segura

Aquí está una pieza de mi código:

public interface IA { void Method(IB entities); } public interface IB { } 

No puedo entender por qué obtengo el siguiente error de comstackción: “El parámetro debe ser seguro para la entrada. Varianza no válida: El parámetro de tipo | TInput | debe ser válido de forma contraria en” IB “.

Cualquier ayuda será apreciada.

El designador de la contravarianza en C # (es decir, in ) es intuitivo solo en el nivel inmediato, cuando crea un método que “toma” un parámetro de tipo genérico. Sin embargo, internamente, la contravarianza significa una inversión de una relación ( Q&A con una explicación ), por lo que su uso dentro de IA hace incompatible con IB .

El problema se ilustra mejor con un ejemplo. Consideremos la clase Animal y su clase derivada del Tiger . Supongamos también que IB tiene un método void MethodB(T input) , que se llama desde el Method de IA :

 class A_Impl : IA { T data; public void Method(IB entities) { entities.MethodB(data); } } 

Declarar IA y IB significa que puede hacer

 IA aForAnimals = new A_Impl(); IA aForTigers = aForAnimals; 

IA tiene un método que toma IB , al que podemos llamar así:

 aForTigers.Method(new B_Impl()); 

Esto es un problema, porque ahora A_Impl pasa un Animal a MethodB de una interfaz que espera un Tiger .

Sin embargo, no tendría ningún problema con IB , ambos con covarianza y contravarianza:

 public interface IB { // ^^^ } // This works public interface IA { void Method(IB x); } // This works too public interface IC { void Method(IB x); }