2009-11-23 4 views
21

मैं एक फ़ंक्शन को कॉल करना चाहता हूं, पैरामीटर के रूप में string और Int32string सिर्फ एक शाब्दिक है, Int32field होना चाहिए। तो मैंने सोचा कि यह कुछ ऐसा होना चाहिए:एमएसआईएल में एक फ़ील्ड कॉल करने से पहले मुझे ldarg.0 क्यों करना है?

.method public hidebysig instance string TestVoid() cil managed 
{ 
    .maxstack 1 
    .locals init (
     [0] string CS$1$0000) 
    L_0000: nop 
    L_0001: ldstr "myString" 
    L_0006: ldfld int32 FirstNamespace.FirstClass::ByteField 
    L_000b: call string [Class1]Class1.TestClass::Functie<int32>(string, int32) 
    L_0010: ret 
} 

लेकिन यह त्रुटि को फेंकता है कि यह मान्य कोड नहीं है।

ldarg.0 

ldfld से पहले यह ठीक ठीक चलता है। यह क्यों है, और क्या यह अधिक खेतों के दौरान मुझे परेशानी में लाने जा रहा है?

उत्तर

35

इंस्टेंस विधियों के पास "यह" नामक एक निहित पैरामीटर है। इसे ढेर के पहले तर्क के रूप में लोड किया गया है, इस प्रकार आपके पास "यह" के लिए ldarg.0 है।

+0

ldarg.0 किसी विधि को पारित पहले पैरामीटर से मेल नहीं खाता है? –

+2

जोएल मार्सी बताते हैं, एक अंतर्निहित पहला पैरामीटर "यह" है। थोड़ा सा जब आप एक एक्सटेंशन विधि घोषित करते हैं और पैरामीटर (यह लक्ष्य टाइप टाइपऑब्जेक्ट, ... जिसे बाद में संदर्भित करने की आवश्यकता नहीं है) – Phil

+0

... उदाहरण के लिए आपके पास एक विधि हो सकती है: सार्वजनिक स्थैतिक चार MyStringMethod (यह स्ट्रिंग इनपुटस्ट्रिंग, इंट इंडेक्स) {वापसी इनपुटस्ट्रिंग [इंडेक्स];} - जब आप इसे कॉल करते हैं, तो पहला पैरामीटर अंतर्निहित होता है - var myCharacter = myString.MyStringMethod (5); - लेकिन विधि को निष्पादित होने पर अभी भी लोड किया जाता है। – Phil

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