为什么我的C#泛型方法中出现“错误:...必须是引用类型”?

时间:2010-01-02 18:54:01

标签: c# linq-to-sql

在各种数据库表中,我同时拥有属性和值列。我正在使用Linq to SQL来访问数据库。

我正在编写一个方法,该方法返回一个包含从给定数据库表中检索的属性/值的字典:

private static Dictionary<string, string> GetProperties<T>(Table<T> table)
{
    Dictionary<string, string> properties = new Dictionary<string, string>();

    foreach (var row in table)
    {
        properties[row.Property]=row.Value;
    }

    return properties;
}

编译完成后,我得到:

  

Error 1 The type 'T' must be a reference type in order to use it as parameter 'TEntity' in the generic type or method 'System.Data.Linq.Table<TEntity>'

我试图在没有运气的情况下搜索此错误消息。

搜索StackOverflow时,这个问题看起来很相似,但关于参数列表:Generic List<T> as parameter on method - 尽管参数仍然不是该问题答案中的参考类型。

阅读MSDN上的C#编程指南:http://msdn.microsoft.com/en-us/library/twcad0zb(VS.80).aspx我看到他们的示例都通过引用传递参数。但是,在我的特定情况下,我无法看到如何通过引用传递,因为泛型类型仅用于指定表的泛型类型。

任何指针都会非常感激。

PS:如果我需要时间接受答案,请注意,因为此功能目前无法访问(我是盲人并使用屏幕阅读器)。

3 个答案:

答案 0 :(得分:62)

这是因为声明Table<T>的原因:

public sealed class Table<TEntity> : IQueryable<TEntity>, 
    IQueryProvider, IEnumerable<TEntity>, ITable, IQueryable, IEnumerable, 
    IListSource
where TEntity : class  // <-- T must be a reference type!

编译器抱怨,因为您的方法对T没有约束,这意味着您可以接受不符合T规范的Table<T>

因此,您的方法需要至少与它接受的内容一样严格。试试这个:

private static Dictionary<string, string> GetProperties<T>(Table<T> table) where T : class

答案 1 :(得分:22)

只需将约束where T : class添加到方法声明中即可。

这是必需的,因为Table<TEntity>具有where TEntity : class约束。否则,可以使用struct type参数调用泛型方法,这需要CLR使用该结构类型参数实例化Table<TEntity>,这将违反Table<TEntity>上的约束。

答案 2 :(得分:0)

public class TEntityRepository<TEntity> : EFRepository<TEntity> , ITEntityRepository<TEntity>
    where TEntity : class, new()
{
}