问题描述
为什么物业得到的错误,而该方法可以被编译?
公共接口的IFoo {}
公接口伊巴尔<出T>其中T:的IFoo {}
公共接口的iItem<出T>其中T:IFoo的
{
// IEnumerable的<&伊巴尔LT; T>>的GetList(); //工程
IEnumerable的<&伊巴尔LT; T>> ITEMLIST {搞定;组; } //错误!
}
错误:
您让编译器错误,因为你有一个属性的getter ( GET
)和一个setter(设置
)。该属性的getter有 T
在它的输出,所以退出
工作,但属性setter将有 T
在它的输入,所以它需要的在
修改
由于你有退出
在 T
您需要删除setter和它会编译:
公共接口的iItem<出T>其中T:IFoo的
{
// IEnumerable的<&伊巴尔LT; T>>的GetList(); //工程
IEnumerable的<&伊巴尔LT; T>> ITEMLIST {搞定; } //也适用
}
如果你的 T
是在
泛型参数,那么可以如下:
公共接口的iItem<在T>其中T:IFoo的
{
IEnumerable的<&伊巴尔LT; T>> ITEMLIST {设置; }
}
但你不能兼得(的那样,
),在同一时间,所以你不能有一个getter和一个setter共同/逆变属性。
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:
You get the compiler error because you have a property getter (get
) and a setter (set
). The property getter has the T
in it's output so out
works, but the property setter will have the T
in its input so it would need the in
modifier.
Because you have out
on T
you need to remove the setter and it will compile:
public interface IItem<out T> where T : IFoo
{
// IEnumerable<IBar<T>> GetList(); // works
IEnumerable<IBar<T>> ItemList { get; } // also works
}
If your T
is an in
generic argument then the following would work:
public interface IItem<in T> where T : IFoo
{
IEnumerable<IBar<T>> ItemList { set; }
}
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.
这篇关于无效的方差:类型参数'T'必须是'UserQuery.IItem< T> .ItemList“contravariantly有效。 “T”是协变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!