मैं एक फ़ंक्शन को कॉल करना चाहता हूं, पैरामीटर के रूप में string
और Int32
। string
सिर्फ एक शाब्दिक है, Int32
field
होना चाहिए। तो मैंने सोचा कि यह कुछ ऐसा होना चाहिए:एमएसआईएल में एक फ़ील्ड कॉल करने से पहले मुझे 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
से पहले यह ठीक ठीक चलता है। यह क्यों है, और क्या यह अधिक खेतों के दौरान मुझे परेशानी में लाने जा रहा है?
ldarg.0 किसी विधि को पारित पहले पैरामीटर से मेल नहीं खाता है? –
जोएल मार्सी बताते हैं, एक अंतर्निहित पहला पैरामीटर "यह" है। थोड़ा सा जब आप एक एक्सटेंशन विधि घोषित करते हैं और पैरामीटर (यह लक्ष्य टाइप टाइपऑब्जेक्ट, ... जिसे बाद में संदर्भित करने की आवश्यकता नहीं है) – Phil
... उदाहरण के लिए आपके पास एक विधि हो सकती है: सार्वजनिक स्थैतिक चार MyStringMethod (यह स्ट्रिंग इनपुटस्ट्रिंग, इंट इंडेक्स) {वापसी इनपुटस्ट्रिंग [इंडेक्स];} - जब आप इसे कॉल करते हैं, तो पहला पैरामीटर अंतर्निहित होता है - var myCharacter = myString.MyStringMethod (5); - लेकिन विधि को निष्पादित होने पर अभी भी लोड किया जाता है। – Phil