簡體   English   中英

C#泛型和推斷類型

[英]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中一次保留更少的項目來獲得良好的性能提升,並通過允許它與其他集合類型一起使用來使代碼更強大。

問題是,在您現有的代碼中,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);
    }
}

嘗試添加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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM