C#泛型和推断类型

时间:2011-11-03 02:12:19

标签: c# .net generics

在尝试编写通用方法来保存和加载Sterling数据库中的数据时,我一直在努力。

这是我的保存方法:

public static void SaveList<T>(List<T> listToSave)
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

我在保存下出现了波浪形的红线,并且出现“T型必须是参考类型以便将其用作参数T”的错误

这是我的加载方法:

    public static List<T> LoadList<T>()
    {
        List<T> list = (from index in DatabaseInstance.Query<T, int>() select index.Key).ToList();

        return list;
    }

我得到了同样的错误。

有什么想法吗?

干杯

史蒂夫

更新:

我按照建议添加了一个where T:class并收到错误:

Type T必须具有公共无参数构造函数才能将其用作参数

根据Bryan提供的链接中的说明,我添加了新的(),现在全部工作。

5 个答案:

答案 0 :(得分:4)

您的定义需要generic type constraint

public static void SaveList<T>(List<T> listToSave) where T : class
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

public static List<T> LoadList<T>()  where T : class
{
    List<T> list = (from index in DatabaseInstance.Query<T, int>() select index.Key).ToList();
    return list;
}

答案 1 :(得分:4)

要修复代码,您需要一个强制引用类型的通用约束,如下所示。要从已发布的其他人中设置此答案,我还建议您使用IEnumerable&lt; T&gt;而不是List&lt; T&gt;:

public static void SaveList<T>(IEnumerable<T> itemsToSave) where T : class
{
    foreach (T item in itemsToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

public static IEnumerable<T> LoadList<T>() where T : class
{
    return (from index in DatabaseInstance.Query<T, int>()
            select index.Key);
}

对IEnumerable&lt; T&gt;的更改应该与所有现有代码兼容,如List&lt; T&gt;已经实现了IEnumerable&lt; T&gt;。如果使用得当,这也可以让你通过在RAM中一次保留更少的项目来获得良好的性能提升,并通过允许它与其他集合类型一起使用来使代码更强大。

答案 2 :(得分:2)

问题在于,在现有代码中,T可以是任何东西。这不行,因为Save函数只接受引用类型。

你需要放置一个constraint,它有效地承诺编译器将T作为引用类型。

public static void SaveList<T>(List<T> listToSave) where T : class
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

答案 3 :(得分:1)

你可以试试吗?

public static void SaveList<T>(List<T> listToSave) where T:class
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

答案 4 :(得分:1)

尝试添加class约束:

public static void SaveList<T>(List<T> listToSave) where T : class
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}

public static List<T> LoadList<T>() where T : class
{
    List<T> list = (from index in DatabaseInstance.Query<T, int>()
            select index.Key).ToList();

    return list;
}