【发布时间】:2017-07-10 10:52:09
【问题描述】:
我创建了一个具有两个泛型参数的方法,其中一个参数 (itemsToAdd) 必须与下一个参数 (inputList) 的泛型参数类型相同。
查看此演示代码:
public class GenericsDemo
{
public void AddToList<TList, TItems>(TList inputList, params TItems[] itemsToAdd)
where TItems : IConvertible
where TList : IEnumerable<TItems>
{
IEnumerable<IConvertible> someOtherList;
// Sounds good, doesn't work..
//someOtherList = inputList;
// This works
someOtherList = (IEnumerable<IConvertible>)inputList;
}
}
我希望inputList 可以直接分配给IEnumerable<IConvertible> someOtherList,但它需要一个演员表。为什么需要演员表?
【问题讨论】:
-
IList<T>是不变的,所以IList<TItems>不是IList<IConvertible>。 -
我刚刚发现
someOtherList = (IList<IConvertible>)inputList;会抛出运行时异常,即使我将TList约束更改为协变的IEnumerable<TItems> -
您需要在
TItems中添加class约束,以便someOtherList = inputList进行编译。当元素类型为结构时,不支持方差。 -
@Chris,这是我在这里的第一个问题。下次会更好:)感谢您的cmets,我不知道可以看到编辑..