2011-08-17 9 views
12

क्या एक सामान्य वर्ग पर बाधा निर्दिष्ट करना संभव है जो कुछ प्रकारों को अस्वीकार करता है? मुझे नहीं पता कि यह संभव है और यदि यह है, तो मुझे यकीन नहीं है कि वाक्यविन्यास क्या होगा। कुछ की तरह:.NET जेनेरिक बाधा में प्रकारों को निर्दिष्ट करने के लिए कैसे निर्दिष्ट करें?

public class Blah<T> where : !string { 
} 

मैं किसी भी अंकन है कि इस तरह की कोई समस्या की अनुमति होगी खोजने के लिए प्रतीत नहीं कर सकते हैं।

+0

ऐसा नहीं लगता कि यह संभव है - लेकिन आपको ऐसा कुछ क्यों चाहिए? – Carsten

+0

कोई वांछित व्यवहार क्या होता है जब कोई ऐसे प्रकार में गुजरने का प्रयास करता है जो समर्थित नहीं है? –

+0

मैं वास्तव में स्ट्रिंग प्रकार को बाहर करने की कोशिश कर रहा था, लेकिन यह पता चला है कि टी: स्ट्रक्चर का उपयोग करने के लिए मैं क्या कर रहा हूं क्योंकि मेरी कक्षा जटिल प्रकारों के लिए काम नहीं करेगी। –

उत्तर

11

निकटतम आप प्राप्त कर सकते हैं एक रन-टाइम बाधा है।

संपादित करें: मूल रूप से मैंने कन्स्ट्रक्टर कॉल में रन-टाइम चेक लगाया। यह वास्तव में इष्टतम नहीं है, क्योंकि यह प्रत्येक तत्कालता पर उपरांत होता है; मेरा मानना ​​है कि यह स्थिर निर्माता में जांच, जो आपके Blah<T> प्रकार के लिए T पैरामीटर के रूप में इस्तेमाल किया प्रकार के अनुसार एक बार सक्रिय किया जाएगा डाल करने के लिए और अधिक समझदार होगा: जाहिर है आदर्श नहीं

public class Blah<T> { 
    static Blah() { 
     // This code will only run ONCE per T, rather than every time 
     // you call new Blah<T>() even for valid non-string type Ts 
     if (typeof(T) == typeof(string)) { 
      throw new NotSupportedException("The 'string' type argument is not supported."); 
     } 
    } 
} 

, लेकिन अगर आप इस बाधा को और दस्तावेज में डालें इस तथ्य को दस्तावेज करें कि string एक समर्थित प्रकार तर्क (उदाहरण के लिए, एक्सएमएल टिप्पणियों के माध्यम से) नहीं है, आपको के पास संकलन-समय की बाधा की प्रभावशीलता प्राप्त करनी चाहिए।

+1

आम तौर पर मैंने क्लास कन्स्ट्रक्टर में सी # में स्पष्ट नहीं किया है। – CodesInChaos

+0

स्ट्रिंग के रूप में हल किए जा सकने वाले प्रकार को शामिल करने के लिए: यदि (टाइपऑफ (स्ट्रिंग) IsAssignableFrom (टाइपोफ (टी))) नया नोट्स समर्थित नहीं किया गया अपवाद – Rasmus

4

नहीं, आप सीधे "अस्वीकृत" प्रकार की बाधाओं को निर्दिष्ट नहीं कर सकते हैं।

+0

क्या कोई अप्रत्यक्ष विधि है, अन्य यह है कि टाइपिंग (टी) कुछ नहीं है? – SirPentor

+0

@SirPentor टाइप बाधा के हिस्से के रूप में नहीं, हालांकि आप कोड में ऐसा कुछ कर सकते हैं। – Donut

2

बाधाएं केवल सकारात्मक बाधाएं हो सकती हैं, जैसा कि documentation में उल्लिखित है।

केवल एक चीज आप कर सकते हैं निर्दिष्ट क्या प्रकार सामान्य प्रकार में रखा जा सकता है, लेकिन आप निर्दिष्ट नहीं कर सकते क्या उन्हें में नहीं रखा जा सकता है।

1

यहाँ की अनुमति की कमी (more detail)

  • जहां टी हैं: struct
  • जहां टी: वर्ग
  • जहां टी: नई()
  • जहां टी: [आधार वर्ग का नाम]
  • जहां टी: [इंटरफ़ेस नाम]
  • जहां टी: यू (टी के लिए प्रदान किया गया प्रकार तर्क यू के लिए दिए गए तर्क से होना चाहिए या प्राप्त होना चाहिए)
संबंधित मुद्दे