[英]Generics: T not assignable to known type. (Why wont this compile?)
我最近试图通过尽可能使用泛型来简化我的一些代码。 然而,这个特殊的例子令我难过......但它看起来很无辜!
这是违规代码(简化)。
public static void Updater(CommodityVO vo)
{
// Update something
}
public static void BulkUpdate<T>(IEnumerable<T> vos)
{
foreach (var vo in vos)
{
Updater(vo);
}
}
在Visual Studio中,'Updater(vo)'中的'vo'得到一条波浪线,编译器(VS2010)报告:
参数类型'T'不能分配给参数类型CommodityVO
<T
>的行为与IEnumerable <T
>相同 我现在一直在解决这个问题。 但是我想知道为什么这被拒绝了...特别是因为这对我来说都很好看。 我错过了什么?
所有帮助赞赏。
你在这里寻找的是通用约束。 类型T
需要被约束为CommodityVO
的实例
public static void BulkUpdate<T>(IEnumerable<T> vos) where T : CommodityVO {
foreach (var vo in vos) {
Updater(vo);
}
}
如果没有这个通用约束,C#编译器就没有关于泛型参数T
信息,并且必须假设T
被实例化为object
的最坏情况。 类型object
与CommodityVO
不兼容,因此会发出错误。 通过添加约束,您可以限制值T
可以实例化为CommodityVO
或从CommodityVO
派生的类型,这意味着转换为CommodityVO
是合法的,因此允许。
Updater函数只能处理CommodityVO
类型的对象。
如果这是您希望能够传递给Updater的各种类型的基本类型,请添加where约束。 where T : CommodityVO
这应该工作
public static void BulkUpdate<T>(IEnumerable<T> vos) where T : CommodityVO
{
foreach (var vo in vos)
{
Updater(vo);
}
}
您希望将泛型类型T约束为Updater函数实际接受的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.