2010-03-16 10 views
7

की अधिभावी मनुष्य में मैं इस तरह एक आधार वर्ग "पिता" है बच्चे में माता-पिता के गेटर को बुला रहा है (या कम से कम यही मेरा इरादा है)।कॉलिंग "बेस मनुष्य" संपत्ति

अब मैं इसे तुरंत चालू करके "चाइल्ड" क्लास का उपयोग करता हूं, एक वर्चुअलप्रोपर्टी में एक मान (चलो कहता हूं 4) निर्दिष्ट करता हूं और फिर संपत्ति को फिर से पढ़ता हूं।

Child c = new Child(); 
c.VirtualProperty = 4; 
Console.Out.WriteLine("Child.VirtualProperty: " + c.VirtualProperty); 

जब मैं इसे चलाता हूं, तो मुझे स्पष्ट रूप से एक एप्लिकेशन अपवाद "डमी एक्स" कहता है। लेकिन अगर मैं बाल में लाइन

if(base.VirtualProperty > 0) 

पर एक ब्रेकपाइंट सेट और base.VirtualProperty के मान की जाँच (इस पर माउस होवर करके) से पहले अपवाद फेंकी जा सकती है (मैं (घ) मान), मुझे पहले ही अपवाद मिल गया है। इससे मैं यह बताता हूं कि "चाइल्ड-गेटटर कॉल खुद" में base.VirtualProperty का बयान; एक प्रकार का।

मैं क्या प्राप्त करने के लिए चाहते हैं एक ही व्यवहार मैं जब मैं संरक्षित करने के लिए parentVirutalInt की परिभाषा बदल (पैरेंट में) और के बजाय बाल base.VirtualProperty की मनुष्य में base.parentVirtualInt का उपयोग करें। और मैं अभी तक नहीं देखता कि यह क्यों काम नहीं कर रहा है। क्या कोई इस पर कुछ प्रकाश डाल सकता है? मुझे लगता है कि ओवरराइड गुण ओवरराइड तरीकों से अलग व्यवहार करते हैं?

वैसे: मैं उस वर्ग को सबक्लासिंग के साथ बहुत कुछ कर रहा हूं जिस पर मेरा कोई नियंत्रण नहीं है (यही कारण है कि मेरा "वर्कअराउंड" एक विकल्प नहीं है)।

तरह डीबगर में

उत्तर

8

यह है (बेशक) एक बग संबंध है। आप अपना वोट feedback article पर जोड़ सकते हैं। यह ठीक करना आसान नहीं है, मुझे यकीन है कि डीबगर के पास बेस प्रॉपर्टी गेटटर विधि पता तक पहुंच नहीं है क्योंकि संपत्ति प्राप्तकर्ता के लिए वी-टेबल स्लॉट व्युत्पन्न कक्षा में बदल दिया गया है।

एक संभावित वर्कअराउंड बेस वैल्यू को स्थानीय चर में पहले स्टोर करना है ताकि आप इसका निरीक्षण कर सकें। यह आपके गेटर को धीमा नहीं करने वाला है।

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