本文介绍了无效的方差:类型参数'T'必须是'UserQuery.IItem< T> .ItemList“contravariantly有效。 “T”是协变的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么物业得到的错误,而该方法可以被编译?



 公共接口的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&LT; T&GT; .ItemList“contravariantly有效。 “T”是协变的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-02 01:08