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.