Why the property get the error while the method can be compiled?
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:
Invalid variance: The type parameter ‘T’ must be contravariantly valid
on ‘UserQuery.IItem<T>.ItemList’. ‘T’ is covariant.
You get the compiler error because you have a property getter (
get) and a setter (set). The property getter has theTin it’s output sooutworks, but the property setter will have theTin its input so it would need theinmodifier.Because you have
outonTyou need to remove the setter and it will compile:If your
Tis aningeneric argument then the following would work:But you cannot have both (
out,in) at the same time so you cannot have a co/contravariant property with a getter and a setter.