C# C泛型与推理类型

C# C泛型与推理类型,c#,.net,generics,C#,.net,Generics,我正在努力编写从Sterling数据库保存和加载数据的通用方法 这是我的保存方法: public static void SaveList<T>(List<T> listToSave) { foreach (T listItem in listToSave) { DatabaseInstance.Save(listItem); } } 我在save下得到了一条弯曲的红线,类型T的错误必须是引用类型,才能将其用作参数T 这是我的加载

我正在努力编写从Sterling数据库保存和加载数据的通用方法

这是我的保存方法:

public static void SaveList<T>(List<T> listToSave)
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}
我在save下得到了一条弯曲的红线,类型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,但出现了一个错误:

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

按照Bryan I提供的链接中的说明添加,最后是新的,现在一切正常。

你能试试吗

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

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

您需要放置一个有效地向编译器承诺T将是引用类型的

public static void SaveList<T>(List<T> listToSave) where T : class
{
    foreach (T listItem in listToSave)
    {
        DatabaseInstance.Save(listItem);
    }
}
您需要了解您的定义:

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;
}
尝试添加类约束:

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;
}

要修复代码,需要一个强制引用类型的通用约束,如下所示。要将此答案与其他已发布的答案区分开来,我还建议您使用IEnumerable而不是List:


对IEnumerable的更改应该与所有现有代码兼容,因为列表已经实现了IEnumerable。如果使用得当,还可以通过在RAM中一次保留较少的项来获得良好的性能提升,并通过允许代码与其他集合类型一起工作来提高代码的功能。

这两种方法值得重命名。可能选择SaveItems和GetItems?作为答案,因为链接到泛型类型约束信息,这有助于避免进一步的错误。
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);
}