簡體   English   中英

泛型:可為空類型的約束

[英]Generics: constraints on nullable types

以下內容無法編譯

public static T Retrieve<T>(this NameValueCollection collection, String key) where T : Object
{

    if (collection.AllKeys.Contains(key))
    {
        try
        {
            val = (T)Convert.ChangeType((object)collection[key], typeof(T));
        }
        catch { }
    }

    return val;            
}

因為約束不能是對象類。 那么有沒有一種方法可以將T禁忌為任何可以設置為null的值呢?

where T : class

您當前的約束, where T : Object表示“任何來自System.Object或從System.Object繼承的東西”,即:一切。 所有類型(包括Int32和String)都從System.Object繼承。 因此,限制對象將無濟於事。

編輯:和往常一樣,埃里克(Eric) 以一種更為准確的方式對此進行了說明

“在C#中,每種類型都源自對象”。 不對! 糾正這個神話的方法是簡單地將“源自”轉換為“可轉換為”,並忽略指針類型: C#中的每個非指針類型都可以轉換為對象。

我認為不可能將您的泛型參數純粹限制為可為空的類型。 您可以輕松地將其約束為引用類型(如上一個答案),但是,盡管所有引用類型都是可為空的,但並非所有可為空的都是引用類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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