2012-10-19 12 views
6

कक्षा में हम जेनेरिक से निपट रहे हैं और उन्हें एक असाइनमेंट पूरा करने के लिए कहा गया था।सी # में, गतिशील प्रकार का उपयोग करने से मुझे जेनेरिक पर ऑपरेटरों का उपयोग करने की अनुमति क्यों मिलती है?

हमने एक संपत्ति Account<T> कक्षा बनाई है जिसमें एक संपत्ति private T _balance; है और उसके बाद _balance क्रेडिट और डेबिट करने के तरीकों को लिखना पड़ा।

Credit method (आंशिक) मुख्य से उदा। acc1.Credit(4.6);:

public void Credit(T credit) 
    { 
     Object creditObject = credit; 
     Object balanceObject = _balance; 

     Type creditType = creditObject.GetType(); 
     Type balanceType = balanceObject.GetType(); 

     if(creditType.Equals(balanceType)) 
     { 
      if(creditType.Equals(typeof (double))) 
      { 
       balanceObject= (double)balanceObject + (double)creditObject; 
      } 
     ...WITH more else if's on int,float and decimal. 
     } 
     _balance = (T)balanceObject; 
    } 

मैं हालत के लिए जाँच की थी और डाली के रूप में मैं नहीं _balance += (T)balanceObject; इस रूप में त्रुटि "Operator '+' cannot be applied to operand of type 'T'"

दे देंगे कर सकते हैं इस विषय पर मेरी पढ़ने के दौरान मैं dynamic प्रकार की खोज की। मेरी नई खाता वर्ग में मैं एक नई विधि जोड़ा गया है और करने के लिए Credit पद्धति को बदल कर: (जैसे acc1.Credit(4.6); द्वारा मुख्य रूप से कहा जाता है)

public void Credit(dynamic credit) 
    { 
     _balance += ConvertType(credit); 
    } 
    public T ConvertType(object input) 
    { 
     return (T)Convert.ChangeType(input, typeof(T)); 
    } 

यह मैं क्या समझ में नहीं आता है। क्रेडिट विधि ऑब्जेक्ट में dynamic टाइप करती है और ConvertType(object input) इसे T टाइप करता है। गतिशील प्रकार का उपयोग करने से मुझे जेनेरिक पर ऑपरेटरों का उपयोग करने की अनुमति क्यों मिलती है?

+0

क्या आपने इसे अभी तक चलाया है? 'डायनामिक' कीवर्ड इस प्रकार की जांच में देरी (स्थगित) करेगा कि संकलक सामान्य रूप से तब तक करता है जब तक आप वास्तव में प्रोग्राम चलाते हैं। –

+0

चीयर्स। कार्यक्रम ठीक चलाता है। मेरे भ्रम को जोड़ने के लिए विधि 'कनवर्ट टाइप' विधि थी जिसने मुझे अपने जेनरिक पर नंबर स्ट्रिंग फेंकने की इजाजत दी। 'Acc1.Credit (" 100 ");'। तो मैं 'जेनेरिक' के बारे में कुछ अजीब विचार शुरू कर रहा था। जैसे ही मैंने 'defer', यूरेका पढ़ा! –

उत्तर

6

dynamic प्रकारों का उपयोग करते समय, संकल्प रनटाइम तक स्थगित कर दिया जाता है। यदि, रनटाइम पर, सामान्य प्रकार + ऑपरेटर का समर्थन करता है, तो आपका कोड काम करेगा। यदि नहीं, तो यह एक अपवाद फेंक देगा।

dynamic पर एक MSDN लेख से

:

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

+0

आपको बहुत बहुत धन्यवाद। यह अब समझ में आता है। :) –

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

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