मैं समझने की कोशिश कर रहा हूं कि सीएलआर संदर्भ प्रकार और बहुरूपता को कैसे लागू करता है। मैंने डॉन बॉक्स के अनिवार्य .Net Vol 1 को संदर्भित किया है जो अधिकांश सामानों को कैलिफ़ाई करने में बहुत मददगार है। लेकिन जब मैं बेहतर समझने के लिए कुछ आईएल कोड के साथ खेलने की कोशिश करता हूं तो मैं निम्नलिखित मुद्दे से अटक गया हूं।कॉलवर्ट हुड के नीचे कैसे काम करता है?
मैं जितनी जल्दी हो सके समस्या को समझाने की कोशिश करूंगा। निम्नलिखित कोड पर विचार करें
class Base
{
public void m()
{
Console.WriteLine("Base.m");
}
}
class Derived : Base
{
public void m()
{
Console.WriteLine("Derived.m");
}
}
अब मुख्य विधि नीचे दिखाया गया है की आईएल के साथ एक सरल सांत्वना आवेदन पर विचार करें। मैं आईएल मैन्युअल रूप से समझने के लिए संकलक द्वारा बनाई गई और ILAsm.exe
के साथ फिर से इकट्ठे.class private auto ansi beforefieldinit Console1.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 44 (0x2c)
.maxstack 1
.locals init ([0] class Console1.Base d)
nop
newobj instance void Console1.Base::.ctor()
stloc.0
ldloc.0
callvirt instance void Console1.Derived::m()
nop
call string [mscorlib]System.Console::ReadLine()
pop
ret
} // end of method Program::Main
} // end of class Console1.Program
मैं नहीं के रूप में वस्तु संदर्भ बेस की एक वस्तु की ओर इशारा करते है चलाने के लिए इस कोड उम्मीद कर रहा था फेरबदल और कोई जिस तरह मूल वस्तु की विधि तालिका में व्युत्पन्न वर्ग में परिभाषित विधि एम() के लिए एक प्रविष्टि होगी।
लेकिन जादुई रूप से यह कोड Derived.m() को निष्पादित करता है !!
तो, वहाँ दो सवाल इसके बाद के संस्करण कोड में मुझे समझ नहीं आता हैं:
क्या प्रकार के महत्व को नीचे आईएल कोड में निर्दिष्ट किया जाता है? मैंने इसे विभिन्न प्रकारों (जैसे सिस्टम.एक्सप्शन !!) में बदलकर प्रयोग करने की कोशिश की है और कोई त्रुटि रिपोर्ट नहीं की गई है। क्यूं कर??
.locals init ([0] वर्ग Console1.Base घ)
- वास्तव में किस प्रकार callvirt है काम करता है? कॉल derived.m() पर कैसे पहुंचा?
अग्रिम धन्यवाद !!
सादर, अजय
@ulrichb: मुझे नहीं लगता कि वह ऐसा कर सकता है। यह 'बेस बी = नया बेस(); ((व्युत्पन्न) बी) .m' जैसा होगा, सिवाय इसके कि वह वास्तव में कास्ट का उपयोग नहीं करता है (जो अपवाद फेंक देगा)। – CodesInChaos
कोड सत्यापन योग्य है? – CodesInChaos
@CodeInChaos: नहीं कोड सत्यापित करने योग्य नहीं है! PEVerify "अप्रत्याशित प्रकार पर स्टैक" त्रुटि देता है। – ajay