泛型:T不能分配给已知类型.(为什么不编译?)

ler*_*nau 8 c# generics

我最近试图通过尽可能使用泛型来简化我的一些代码.然而,这个特殊的例子令我难过......但它看起来很无辜!

这是违规代码(简化).

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

  • "vo"的类型似乎并不重要.例如:字符串也不起作用.
  • List <T>与IEnumerable <T>的行为相同
  • 各种'where'条款似乎没有效果.
  • 我现在一直在解决这个问题.但是我想知道为什么这被拒绝了...特别是因为这对我来说都很好看.我错过了什么?

    所有帮助赞赏.

    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为合法且因此允许.