C# C泛型与推理类型
我正在努力编写从Sterling数据库保存和加载数据的通用方法 这是我的保存方法: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 这是我的加载
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);
}