为什么属性在可以编译方法时出现错误?
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!
}
错误:
方差无效:类型参数"T"必须逆变有效 在'UserQuery.IItem
上。项目列表"。"T"是协变。
你得到编译器错误,因为你有一个属性getter(get
)和一个setter(set
)。属性 getter 在其输出中具有T
,因此out
工作,但属性 setter 将在其输入中具有T
,因此它需要 in
修饰符。
因为您out
T
所以您需要删除 setter,它将编译:
public interface IItem<out T> where T : IFoo
{
// IEnumerable<IBar<T>> GetList(); // works
IEnumerable<IBar<T>> ItemList { get; } // also works
}
如果您的T
是in
泛型参数,则以下内容将起作用:
public interface IItem<in T> where T : IFoo
{
IEnumerable<IBar<T>> ItemList { set; }
}
但是你不能同时拥有两者(out,in
),所以你不能有一个与getter和一个setter的协变/逆变性质。
不允许使用二传手,因为如果是这样,您将能够这样做:
public interface ISubFoo : IFoo { }
IItem<ISubFoo> item = //whatever
item.ItemList = new List<IBar<IFoo>>>();
这不是类型安全的。