泛型:对可空类型的约束

时间:2009-10-09 23:32:02

标签: c# generics

以下内容无法编译

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;            
}

因为Constraint不能是对象类。那么有没有办法可以将T改为任何可以设置为null的东西?

2 个答案:

答案 0 :(得分:13)

where T : class

您当前的约束,where T : Object表示“System.Object中存在或继承的任何内容”,即:所有内容。所有类型(包括Int32和String)都继承自System.Object。所以对Object的约束什么都不做。

编辑:像往常一样,Eric对这个in a far more accurate way

有所了解
  

“在C#中,每种类型都来自对象”。不对!纠正这个神话的方法是简单地将“derives from”替换为“is convertible to”,并忽略指针类型: C#中的每个非指针类型都可以转换为object。

答案 1 :(得分:0)

我认为不可能将泛型参数纯粹限制为可空类型。您可以轻松地将其约束为引用类型(如前面的答案中所述),但是,虽然所有引用类型都可以为空,但并非所有的nullables都是引用类型。