我最近试图通过尽可能使用泛型来简化我的一些代码.然而,这个特殊的例子令我难过......但它看起来很无辜!
这是违规代码(简化).
public static void Updater(CommodityVO vo)
{
// Update something
}
public static void BulkUpdate<T>(IEnumerable<T> vos)
{
foreach (var vo in vos)
{
Updater(vo);
}
}
Run Code Online (Sandbox Code Playgroud)
在Visual Studio中,'Updater(vo)'中的'vo'得到一条波浪线,编译器(VS2010)报告:
参数类型'T'不能分配给参数类型CommodityVO
<T>与IEnumerable <T>的行为相同我现在一直在解决这个问题.但是我想知道为什么这被拒绝了...特别是因为这对我来说都很好看.我错过了什么?
所有帮助赞赏.
Jar*_*Par 12
你在这里寻找的是通用约束.该类型T需要被约束为一个实例CommodityVO
public static void BulkUpdate<T>(IEnumerable<T> vos) where T : CommodityVO {
foreach (var vo in vos) {
Updater(vo);
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有这个通用约束,C#编译器就没有关于泛型参数的信息,T并且必须假设T被实例化为最坏的情况object.该类型object与之不兼容,CommodityVO因此会发出错误.通过添加约束,您可以限制值,T或者可以实现CommodityVO类型派生,从CommodityVO哪个类型转换CommodityVO为合法且因此允许.
| 归档时间: |
|
| 查看次数: |
5047 次 |
| 最近记录: |