Pourquoi la propriété obtient-elle l’erreur alors que la méthode peut être compilée?
public interface IFoo {} public interface IBar where T : IFoo {} public interface IItem where T: IFoo { // IEnumerable<IBar> GetList(); // works IEnumerable<IBar> ItemList { get; set; } // Error! }
Erreur:
Variance non valide: le paramètre de type ‘T’ doit être valable de manière contre-variable sur ‘UserQuery.IItem .ItemList’. ‘T’ est covariant.
Vous obtenez l’erreur du compilateur car vous avez une propriété getter ( get
) et un setter ( set
). Le getter de propriété a le T
dans sa sortie, donc ça marche, mais le créateur de propriété aura le T
dans son entrée, il aurait donc besoin du modificateur in
.
Parce que vous avez sur T
vous devez supprimer le setter et il va comstackr:
public interface IItem where T : IFoo { // IEnumerable> GetList(); // works IEnumerable> ItemList { get; } // also works }
Si votre T
est un argument générique, les éléments suivants fonctionneraient:
public interface IItem where T : IFoo { IEnumerable> ItemList { set; } }
Mais vous ne pouvez pas avoir les deux ( out,in
) en même temps, vous ne pouvez donc pas avoir une propriété co / contravariante avec un getter et un setter.
Le passeur n’est pas autorisé, car si c’était le cas, vous pourriez le faire:
public interface ISubFoo : IFoo { } IItem item = //whatever item.ItemList = new List>>();
qui n’est pas du type sûr.