以下内容无法编译
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的东西?
答案 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都是引用类型。