2009-04-30 49 views
49

मेरे पास सामान्य प्रकार के साथ निम्न विधि है:जेनेरिक प्रकार सीमा को आदिम प्रकारों को कैसे परिभाषित करें?

T GetValue<T>(); 

मैं टी को आदिम प्रकारों जैसे int, string, float पर सीमित करना चाहता हूं लेकिन वर्ग प्रकार नहीं। मुझे पता है कि मैं सामान्य प्रकार के वर्ग के लिए जेनेरिक परिभाषित कर सकता हूं:

C GetObject<C>() where C: class; 

मुझे यकीन नहीं है कि यह आदिम प्रकारों के लिए संभव है और यदि ऐसा है तो।

उत्तर

42

आप मूल्य प्रकार तक सीमित करने के लिए इसका उपयोग कर सकते हैं:

where C: struct 

तुम भी स्ट्रिंग का उल्लेख है। दुर्भाग्यवश, तारों की अनुमति नहीं दी जाएगी क्योंकि वे मूल्य प्रकार नहीं हैं।

T GetObject<T>() where T : struct; 
+0

लेकिन स्ट्रिंग के लिए नहीं ValueType वर्ग के लिए परिभाषित किया गया जो व्यर्थ है –

+1

और निश्चित रूप से यह आप किसी भी उपयोगकर्ता परिभाषित struct प्रकार पारित की सुविधा देता है के कुछ उपयोगी संकेत प्राप्त कर सकते हैं, न केवल प्राचीन प्रकार। मुझे यकीन नहीं है कि सभी अंतर्निहित आदिम प्रकारों के लिए ओवरलोड को परिभाषित करने के अलावा वास्तव में एक तरीका है। –

13

यहाँ आप के लिए क्या देख रहे हैं? यह हो सकता है कि आपको वास्तव में IComparable, या किसी अन्य इंटरफेस को लागू करने के लिए सी की आवश्यकता है। इस मामले में आप

T GetObject<T> where T: IComparable 
+0

इसे डांगो! मुझे नफरत है जब कोई मुझे पंच पर मारता है। अच्छा बीएफरी! –

+0

स्ट्रिंग के बारे में कैसे प्राचीन है लेकिन शून्य प्रकार –

+2

@ डेविड: स्ट्रिंग एक आदिम प्रकार नहीं है। यह एक संदर्भ प्रकार है कि कुछ मामलों में एक आदिम प्रकार के रूप में माना जाता है। – Samuel

5

आप वास्तव में विधि में क्या करना कोशिश कर रहे हैं:

9

कोई सामान्य बाधा नहीं है जो चीजों के सेट को साफ से मेल खाती है। क्या वास्तव में आप करना चाहते हैं? उदाहरण के लिए, आप रनटाइम चेक के साथ इसके आसपास हैक कर सकते हैं, जैसे एक स्थिर सीटीआर (जेनेरिक प्रकारों के लिए - सामान्य तरीकों के लिए इतना आसान नहीं) ...

हालांकि; अधिकांश समय मैं यह देख ऐसा इसलिए है क्योंकि लोगों में से एक हैं: जिसमें मामले का उपयोग EqualityComparer<T>.Default

  • /तरह आइटम की तुलना करने में सक्षम हो:

    • समानता के लिए आइटम की जाँच करने में सक्षम हो जो मामले उपयोग में असल में यह निश्चित करने के लिए काम का विस्तार करता है generic operators
  • 15

    के लिए ऐसी स्थिति में उपयोग MiscUtil के समर्थन: Comparer<T>.Default

  • अंकगणित को निष्पादित करने में सक्षम होना

    public T Object<T>() where T : 
        struct, IComparable, IFormattable, IConvertible, IComparable<T>, IEquatable<T> 
    

    सांख्यिक प्रकार के लिए सीमित करने के लिए आप निम्न नमूने

  • संबंधित मुद्दे