泛型:对可空类型的约束

Dan*_*iel 1 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;            
}
Run Code Online (Sandbox Code Playgroud)

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

Rex*_*x M 13

where T : class
Run Code Online (Sandbox Code Playgroud)

您当前的约束,where T : Object表示"从System.Object继承或继承的任何内容",即:所有内容.所有类型(包括Int32和String)都继承自System.Object.因此限制对象将无能为力.

编辑:像往常一样,埃里克以更加准确的方式对此进行了阐述:

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

  • 这不会允许T的可空值类型,他想要"任何可以设置为'null`"的东西. (3认同)
  • 这实际上是一个神话,所有类型都从对象继承:http://blogs.msdn.com/ericlippert/archive/2009/08/06/not-everything-derives-from-object.aspx - 但是,你的观点很好拍摄.我们不允许约束对象的原因是因为已经是所有类型参数必须可以转换为对象的情况,所以这是一个没有任何意义的约束,因此可能是一个错误. (2认同)