2012-07-13 24 views
5

我的函数需要你传递一个字符串和一个类型为T.基于T我想解析字符串val作为该类型,但我得到错误的标题这个问题。任何人有任何洞察力或其他方式来完成这个功能,我将不胜感激。约束不能是特殊类'System.Object'

T Parse<T>(string val) where T : System.Object 
    { 
     TypeCode code = Type.GetTypeCode(typeof(T)); 
     switch (code) 
     { 
      case TypeCode.Boolean: 
       return System.Boolean.Parse(val); 
       break; 
      case TypeCode.Int32: 
       return Int32.Parse(val); 
       break; 
      case TypeCode.Double: 
       return Double.Parse(val); 
       break; 
      case TypeCode.String: 
       return (string)val; 
       break; 
     } 
     return null; 
    } 
+3

你是什么那里做滥用泛型。如果你要检查一个类型,为什么要使用泛型? – Oded 2012-07-13 17:05:51

+0

[C#泛型:约束T其中T:Object不编译;错误:约束不能是特殊类'对象'](http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal 2013-04-19 07:04:03

回答

15

只要删除where T : System.Object

通过声明:

where T : System.Object 

你说T可用在你的方法Parse的类型必须从对象继承。
但是,由于C#中的每个对象都从System.Object继承,所以不需要该约束(并且可能这是编译器不允许这样做的原因之一)。

而且,既然你回来null,你应该约束类型T是引用类型,所以:

where T: class 

但这种方式不能返回一个布尔值,整数或任何价值类型。

然而,你的代码基本上是模仿的Convert.ChangeType的功能,唯一的区别是,你使用泛型返回正确的类型,而不是对象,但基本上是相等的:

T Parse<T>(string val) 
{ 
    return (T)Convert.ChangeType(val,typeof(T)); 
} 
+0

搜索为了别的东西,但发现这个答案解决了我的问题。 – 2015-09-16 10:00:52