[英]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.