繁体   English   中英

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

[英]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

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

    所有帮助赞赏。

    你在这里寻找的是通用约束。 类型T需要被约束为CommodityVO的实例

    public static void BulkUpdate<T>(IEnumerable<T> vos) where T : CommodityVO {
      foreach (var vo in vos) {
        Updater(vo);
      }
    }
    

    如果没有这个通用约束,C#编译器就没有关于泛型参数T信息,并且必须假设T被实例化为object的最坏情况。 类型objectCommodityVO不兼容,因此会发出错误。 通过添加约束,您可以限制值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.

     
    粤ICP备18138465号  © 2020-2024 STACKOOM.COM