2009-07-30 5 views
6

मैं निम्न विधि है:जेनरिक प्रकारों का अनुमान लगाने के लिए सी # कंपाइलर कैसे प्राप्त करें?

public TResult Get<TGenericType, TResult>() 
          where TGenericType : SomeGenericType<TResult> 
          where TResult : IConvertible { 
    //...code that uses TGenericType... 
    //...code that sets someValue... 
    return (TResult) someValue; 
} 

अभी, इस पद्धति का एक उपयोगकर्ता इस तरह इसका इस्तेमाल करने की है:

//Notice the duplicate int type specification 
int number = Get<SomeGenericType<int>, int>(); 

क्यों विधि defintion में TResult निर्दिष्ट करने के लिए मैं क्या ज़रूरत है? संकलक पहले से ही TResult जानता है क्योंकि मैंने इसे TGenericType में निर्दिष्ट किया है। आदर्श रूप में (यदि सी # संकलक एक छोटे से होशियार था), मेरे विधि इस प्रकार दिखाई देगा:

public TResult Get<TGenericType>() 
          where TGenericType : SomeGenericType<TResult> 
          where TResult : IConvertible { 
    //...code that uses TGenericType... 
    //...code that sets someValue... 
    return (TResult) someValue; 
} 

तो उपयोगकर्ता बस इसे इस तरह इस्तेमाल कर सकते हैं:

//Much cleaner 
int number = Get<SomeGenericType<int>>(); 

वहाँ ऐसा करने के लिए एक रास्ता है मुझे क्या करने का मन है?

+0

मुझे लगता है कि प्रश्नोत्तरी से * बेवकूफ * जैसे कुछ क्वालीफायर हटाने से मदद मिलेगी। – EFraim

+0

यह संकलक है जो बेवकूफ है, है ना? ;) मैंने अपर्याप्त टिप्पणी हटा दी। यह वास्तव में इसके बिना एक उचित सवाल है। –

+0

चूंकि आपको उत्तर दिया गया है कि कुछ प्रकार के पैरामीटर का उपयोग करने का कोई तरीका नहीं है, शायद आप जो भी हासिल करना चाहते हैं उसके संदर्भ में आपको अपने प्रश्न को दोबारा सुधारना चाहिए। जैसा कि यह खड़ा है, आपका सवाल है "मैं सी # कंपाइलर संकलन कोड कैसे बना सकता हूं जो सी # भाषा की परिभाषा का उल्लंघन करता है?" इस प्रकार, इसे "वास्तविक प्रश्न नहीं" के रूप में बंद किया जाना चाहिए। –

उत्तर

8

सी # विनिर्देश आधे प्रकार के तर्कों को घुमाने की अनुमति नहीं देता है। आपको या तो कंपाइलर को सभी प्रकार के तर्कों का अनुमान लगाने देना चाहिए (जो हमेशा आपके मामले में लागू नहीं होते हैं) या मैन्युअल रूप से उन सभी को निर्दिष्ट करते हैं।

अद्यतन (टिप्पणी करने के लिए उत्तर): क्या आप जानते हैं जब मैं आपके सवाल का जवाब देने के लिए एक निरपेक्ष सी # टीम पर नहीं कर रहा हूँ, मेरे अटकलें हैं कि अधिभार संकल्प की जटिलता (जो पहले से ही तो बहुत ही है कि यदि आप सी # विनिर्देश के उस खंड को पढ़ते हैं) तो महत्वपूर्ण रूप से बढ़ेगा यदि वे आधा प्रकारों का अनुमान लगाया जाना चाहते हैं और आधा नहीं (विशेष रूप से इस तथ्य पर विचार करना कि आप सामान्य तर्कों की संख्या से पूरी तरह से विधियों को अधिभारित कर सकते हैं)।

+0

लेकिन उन्होंने सी # विनिर्देश में क्यों निर्दिष्ट किया? ऐसा नहीं है कि इसके बारे में कुछ भी असुरक्षित है। –

+0

कुछ सी ++ नियमों में देखें, जिनमें टेम्पलेट्स के आंशिक विशेषज्ञता और एक्सेस विनिर्देशक कैसे काम करते हैं। आम तौर पर चीजें सुचारू रूप से काम करती हैं, लेकिन यहां और वहां छिपकर गठिया मिलती हैं। चूंकि जावा और सी # के पीछे के विचारों में से एक सी ++ की जटिलता से बचने के लिए था, इसके बजाय थोड़ा असुविधा स्वीकार करते हुए, यह सही है। –

1

यह निर्भर करता है ...

तुम सिर्फ SomeGenericType<TResult> का उपयोग कर रहे हैं, तो आप कर सकते हैं:

public TResult Get<TResult>() where TResult : IConvertible { 
    SomeGenericType<TResult> myInstance = ... 
    //...code that sets someValue... 
    return (TResult) someValue; 
} 

वहाँ जरूरी इस मामले में, वहाँ में पहले प्रकार डाल करने के लिए एक तरीका नहीं है । चूंकि आपका उदाहरण एक पैरामीटर के रूप में SomeGenericType<TResult> में स्पष्ट रूप से गुजर रहा है, यह सुझाव देता है कि यह संभव होगा।

अन्यथा, आपको अपने सभी सामान्य तर्कों को पूरी तरह से निर्दिष्ट करने की आवश्यकता है। दुर्भाग्य से, यह वही तरीका है जो सी # में है।

+0

निश्चित रूप से, लेकिन मुझे विधि में SomeGenericType का उपयोग करने की आवश्यकता है। मैं इसे स्पष्ट करने के लिए अपना नमूना कोड अपडेट करूंगा। –

+0

हाँ, लेकिन मेरे कोड को देखें - जब तक यह विधि के पैरामीटर के रूप में पारित नहीं किया जाता है, तब तक आप विधि में कुछ GenericType का उपयोग कर सकते हैं (यानी: यदि आप विधि में एक बनाते हैं)। चूंकि आप ट्रेशल्ट को जानते हैं, यह ठीक काम करता है। जैसा कि मैंने कहा - यह कुछ मामलों में काम कर सकता है ... –

+0

क्षमा करें, मेरा मतलब है कि मुझे TGenericType का उपयोग करने की आवश्यकता है (मेरा अद्यतन नमूना कोड देखें)। –

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