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