Variance non valide: le paramètre de type ‘T’ doit être valable de manière contre-variable sur ‘UserQuery.IItem .ItemList’. ‘T’ est covariant

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.