方差无效:类型参数"T"在"UserQuery.IItem"上必须逆变有效<T>。项目列表"。"T"是协变的



为什么属性在可以编译方法时出现错误?

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
}

如果您的Tin泛型参数,则以下内容将起作用:

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>>>();

这不是类型安全的。

相关内容

  • 没有找到相关文章

最新更新