[英]C# Generics and inferring type
我在努力编写通用方法来保存和加载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;
}
我犯了同样的错误。
有任何想法吗?
干杯
史蒂夫
更新:
我按照建议添加了一个T:class,并收到错误:
Type T必须具有公共无参数构造函数才能将其用作参数
按照Bryan提供的链接中的说明添加,new()结束,现在全部工作。
您的定义需要泛型类型约束 :
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 <T>而不是List <T>:
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 <T>的更改应该与所有现有代码兼容,因为List <T>已经实现了IEnumerable <T>。 如果使用得当,这也可以让你通过在RAM中一次保留更少的项目来获得良好的性能提升,并通过允许它与其他集合类型一起使用来使代码更强大。
你能试一下吗?
public static void SaveList<T>(List<T> listToSave) where T:class
{
foreach (T listItem in listToSave)
{
DatabaseInstance.Save(listItem);
}
}
尝试添加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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.