tipo ser referencia genericas debe clases c# covariance

c# - referencia - Variación no válida: el parámetro de tipo ''T'' debe ser válido de forma contravariante en ''UserQuery.IItem<T>.ItemList''. ''T'' es covariante



interface where t class c# (2)

¿Por qué la propiedad recibe el error mientras se puede compilar el método?

public interface IFoo {} public interface IBar<out T> where T : IFoo {} public interface IItem<out T> where T: IFoo { // IEnumerable<IBar<T>> GetList(); // works IEnumerable<IBar<T>> ItemList { get; set; } // Error! }

Error:

Variación no válida: el parámetro de tipo ''T'' debe ser válido de forma contravariante en ''UserQuery.IItem <T> .ItemList''. ''T'' es covariante.


El setter no está permitido, ya que si lo fueras, podrías hacer esto:

public interface ISubFoo : IFoo { } IItem<ISubFoo> item = //whatever item.ItemList = new List<IBar<IFoo>>>();

que no es de tipo seguro.


Obtiene el error del compilador porque tiene una propiedad getter ( get ) y un setter ( set ). El captador de propiedades tiene la T en su salida, así out funciona, pero el establecedor de propiedades tendrá la T en su entrada, por lo que necesitaría el modificador in .

Debido a que tienes out en T debes quitar el setter y se compilará:

public interface IItem<out T> where T : IFoo { // IEnumerable<IBar<T>> GetList(); // works IEnumerable<IBar<T>> ItemList { get; } // also works }

Si su T es un argumento genérico, lo siguiente funcionaría:

public interface IItem<in T> where T : IFoo { IEnumerable<IBar<T>> ItemList { set; } }

Pero no puede tener ambos ( out,in ) al mismo tiempo, por lo que no puede tener una propiedad co / contravariant con un getter y un setter.