2012-01-17 11 views
8

निम्नलिखित वर्ग पर विचार करें: where TBase : class
मैं भी पाबंदी लगा रखी TDerived सामान्य:क्लास और विधि स्तर सामान्य प्रकार की कमी बातचीत

public class DerivedClassPool<TBase> where TBase : class 
{ 
    public TBase Get(Type componentType) 
    { 
     // Not important, but you get the idea 
     return Activator.CreateInstance(componentType) as TBase; 
    } 

    public TDerived SomeMethod<TDerived>() where TDerived : TBase 
    { 
     return Get(typeof(TBase)) as TDerived; 
    } 
} 

ध्यान दें कि मैं TBase सामान्य वर्ग तर्क पर पाबंदी लगा रखी एक वर्ग होने के लिए विधि तर्क TBase या उस से व्युत्पन्न कुछ: where TDerived : TBase

मैं as TDerived लाइन पर कोई त्रुटि मिलती है:

प्रकार पैरामीटर 'TDerived' के साथ नहीं किया जा सकता ऑपरेटर 'के रूप में' यह एक वर्ग के प्रकार बाधा है और न ही एक 'क्लास' बाधा नहीं है क्योंकि

मैं समझता हूँ कि त्रुटि मैं बाधा class जोड़ने की जरूरत को रोकने के लिए, तो मैं मिल चाहते हैं:

where TDerived : class, TBase 

मुझे ऐसा क्यों करना है जब TBase पहले से ही कक्षा होने के लिए बाध्य है और TDerivedTBase या उससे व्युत्पन्न है?

+1

http://stackoverflow.com/questions/8002148/c-sharp-generics-contraints-propagation देखें। एरिक इसे वहाँ देता है। –

+1

@ जेसन, मुझे लगता है कि यह 'लेकिन' के साथ बेहतर पढ़ता है। – Joey

+1

@ जॉय: पर्याप्त मेला। वाक्यों से नफरत है जब वाक्य 'लेकिन' के साथ शुरू होते हैं, भले ही वाक्य शुरू करने के लिए संयोजन का उपयोग इन दिनों सही माना जाता है। मैं अपने हाई स्कूल अंग्रेजी शिक्षक को दोषी ठहराता हूं। वह क्लासिक अंग्रेजी सम्मेलनों के लिए एक स्टिकर था। –

उत्तर

8

अद्यतन: यह प्रश्न the subject of my blog on September 19th, 2011 था। महान सवाल के लिए धन्यवाद!


क्यों मैं जब TBase पहले से ही एक वर्ग होने के लिए विवश है और TDerived एक TBase या इसे से प्राप्त होने के लिए विवश है यह करने के लिए है?

क्योंकि एक मान प्रकार किसी संदर्भ प्रकार से प्राप्त किया जा सकता है। int संदर्भ प्रकार object और System.ValueType से लिया गया है और कई इंटरफेस लागू करता है। यह int एक संदर्भ प्रकार नहीं बनाता है।

के उदाहरण पर SomeMethod<int> पर कॉल करने के लिए यह पूरी तरह कानूनी है क्योंकि int वस्तु से प्राप्त होता है।

अब, मामले हैं जहां आपकी आलोचना की आवश्यकता होगी। कोई ऐसी परिस्थितियों का निर्माण कर सकता है जिसमें दो प्रकार के पैरामीटर इस तरह से संबंधित होते हैं कि दोनों तर्कसंगत रूप से केवल संदर्भ प्रकार ही हो सकते हैं, लेकिन उनमें से केवल एक को भाषा द्वारा "संदर्भ प्रकार के रूप में जाना जाता है" के रूप में वर्गीकृत किया जाता है।

पाठक के लिए एक अभ्यास के रूप में: क्या आप एक पा सकते हैं? "संदर्भ प्रकार होने के लिए जाना जाता है" की सटीक परिभाषा के लिए विनिर्देश के खंड 10.1.5 को ध्यान से पढ़ना आवश्यक हो सकता है।

+0

क्या हमारे स्वयं के मूल्य प्रकार बनाना संभव है जो संदर्भ प्रकारों से प्राप्त होते हैं (सी # में)? –

+0

@ जॉर्ज डकेट यह प्रासंगिक क्यों है? –

+0

@OskarKjellin: यह नहीं है, मैं सिर्फ उत्सुक हूँ। :) –

2

क्योंकि TBase एक इंटरफ़ेस हो सकता है और इसलिए TDerived एक मान प्रकार हो सकता है।

+0

टीबीएएस को कक्षा होना चाहिए? –

+1

क्या आप इसके बारे में निश्चित हैं? http://msdn.microsoft.com/en-us/library/d5x73970.aspx: 'प्रकार तर्क एक संदर्भ प्रकार होना चाहिए; यह किसी भी वर्ग, इंटरफ़ेस, प्रतिनिधि, या सरणी प्रकार पर भी लागू होता है। –

+1

इसके बारे में नहीं पता था। ट्रिकी कि 'कक्षा' का अर्थ इस मामले में "मूल्य प्रकार" है –

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