C# 泛型约束需要强制转换

C# 泛型约束需要强制转换,c#,.net,list,generics,C#,.net,List,Generics,我创建了一个具有两个泛型参数的方法,其中一个参数(itemsToAdd)必须与下一个参数(inputList)的泛型参数类型相同 请参阅此演示代码: public class GenericsDemo { public void AddToList<TList, TItems>(TList inputList, params TItems[] itemsToAdd) where TItems : IConvertible where TList

我创建了一个具有两个泛型参数的方法,其中一个参数(
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;
    }
}
public类GenericsDemo
{
public void AddToList(TList inputList,params TItems[]itemsToAdd)
其中TItems:i可转换
where-TList:IEnumerable
{
IEnumerable someOtherList;
//听起来不错,不起作用。。
//someOtherList=输入列表;
//这很有效
someOtherList=(IEnumerable)inputList;
}
}

我希望
输入列表
可以直接分配到
IEnumerable someOtherList
中,但它需要强制转换。为什么需要强制转换?

协方差仅适用于类,不适用于结构()

因此,如果将
TItems
限制为引用类型,则代码将编译():


IList
是不变的,因此
IList
不是
IList
将引发运行时异常,即使我将
TList
约束更改为
IEnumerable
,这是协变的。您需要为
someOtherList=inputList
添加
class
约束以进行编译。元素类型为结构时不支持方差。@Chris,这是我在这里的第一个问题。下一次会更好:)谢谢你的评论,我不知道编辑的内容能被看到。。
    where TItems : class, IConvertible