【问题标题】:Need help with C# generics需要 C# 泛型方面的帮助
【发布时间】:2009-11-30 19:30:16
【问题描述】:

我在编写一个使用泛型的类时遇到了一些麻烦,因为这是我第一次不得不创建一个使用泛型的类。

我要做的就是创建一个将 List 转换为 EntityCollection 的方法。

我收到编译器错误: 类型“T”必须是引用类型才能在泛型类型或方法“System.Data.Objects.DataClasses.EntityCollection”中用作参数“TEntity”

这是我尝试使用的代码:

    public static EntityCollection<T> Convert(List<T> listToConvert)
    {
        EntityCollection<T> collection = new EntityCollection<T>();

        // Want to loop through list and add items to entity
        // collection here.

        return collection;
    }

它在抱怨 EntityCollection 集合 = new EntityCollection() 代码行。

如果有人能帮助我解决这个错误,或者向我解释为什么我会收到它,我将不胜感激。谢谢。

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    阅读 .NET 中的通用约束。具体来说,您需要一个“where T : class”约束,因为 EntityCollection 不能存储值类型(C# 结构),但不受约束的 T 可以包含值类型。您还需要添加一个约束来说明 T 必须实现 IEntityWithRelationships,同样因为 EntityCollection 需要它。这会产生如下结果:

    public static EntityCollection<T> Convert<T>(List<T> listToConvert) where T : class, IEntityWithRelationships
    

    【讨论】:

      【解决方案2】:

      您必须将类型参数 T 限制为引用类型:

      public static EntityCollection<T> Convert(List<T> listToConvert) where T: class
      

      【讨论】:

      • 我发现这个答案对编译有最低要求。
      【解决方案3】:

      您可能会收到该错误,因为 EntityCollection 构造函数要求 T 是一个类,而不是一个结构。您需要在您的方法上添加where T:class 约束。

      【讨论】:

        【解决方案4】:

        您需要泛型约束,但还需要将您的方法声明为泛型以允许这样做

          private static EntityCollection<T> Convert<T>(List<T> listToConvert) where T : class,IEntityWithRelationships
                {
                    EntityCollection<T> collection = new EntityCollection<T>();
        
                    // Want to loop through list and add items to entity
                    // collection here.
        
                    return collection;
                }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-26
          • 1970-01-01
          相关资源
          最近更新 更多