2012-07-13 18 views
5

मेरा फ़ंक्शन आवश्यक है कि आप इसे एक स्ट्रिंग और टी के रूप में टाइप करें। टी के आधार पर मैं स्ट्रिंग वैल को उस प्रकार के रूप में पार्स करना चाहता हूं, लेकिन मुझे शीर्षक से त्रुटि मिलती है यह प्रश्न। कोई भी जिसके पास इस कार्य को पूरा करने के लिए कोई अंतर्दृष्टि या अन्य तरीके हैं, मैं इसकी सराहना करता हूं।बाधा विशेष वर्ग 'सिस्टम नहीं हो सकती है। ऑब्जेक्ट'

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

+0

संभावित डुप्लिकेट [सी # जेनिक्स: टी को रोकना जहां टी: ऑब्जेक्ट संकलित नहीं करता है; त्रुटि: प्रतिबंध विशेष वर्ग 'ऑब्जेक्ट' नहीं हो सकता है] (http://stackoverflow.com/questions/10644703/c-sharp-generics-constraining-t-where-t-object-doesnt-compile-error-constr) – nawfal

उत्तर

15

बस where T : System.Object हटा दें।

बताते हुए द्वारा:

where T : System.Object 

तुम कह रहे हो कि प्रकार के अपने विधि Parse में T प्रयोग करने योग्य वस्तु से विरासत चाहिए।
लेकिन, चूंकि सी # में प्रत्येक ऑब्जेक्ट System.Object से प्राप्त होता है, इसलिए आपको उस बाधा की आवश्यकता नहीं होती है (और शायद यही कारण है कि संकलक इसे अनुमति नहीं देता है)।

इसके अलावा

, जब से तुम null लौट रहे हैं, तो आप प्रकार T में रोके एक संदर्भ प्रकार, ऐसा हो जाना चाहिए:

where T: class 

लेकिन इस तरह से आप एक बूलियन, पूर्णांक या जो कुछ भी मूल्य वापस नहीं लौट सकते प्रकार।

हालांकि, अपने कोड मूल रूप से Convert.ChangeType की कार्यक्षमता की नकल करता, फर्क सिर्फ इतना है कि आप जेनरिक का उपयोग कर रहे वस्तु के स्थान पर सही प्रकार वापस जाने के लिए है, लेकिन मूल रूप से इस के बराबर है:

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

खोजे गए कुछ और के लिए लेकिन इस प्रतिक्रिया को मिला जिसने मेरी समस्या हल की। –