2012-07-13 218 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