Microsoft इंटरमीडिएट भाषा (MSIL) में 0 क्यों एक प्रकार है!


88

कई एमएसआईएल लिस्टिंग में, मैंने निम्नलिखित देखा है:

System.Nullable`1<!0> etc ...

या

class !0 etc ...

!0इन परिस्थितियों में क्या अर्थ है?

जवाबों:


118

यह एक .NET असेंबली को देखने के लिए आपके द्वारा उपयोग किए जाने वाले डिकंपाइलर का क्विकर है। यह ildasm.exe का व्यवहार है, रिफ्लेक्टर या ILSpy जैसे अन्य लोगों को यह अधिकार मिलता है। Microsoft प्रोग्रामर जिसने इसे लिखा था उसने शॉर्टकट लिया, वह IL से एक स्ट्रिंग बनाता है जो मेटाडेटा में टाइप तर्क नाम देखने के लिए अतिरिक्त कोड लिखे बिना, जिस तरह से एनकोड किया गया है, उसी प्रकार का तर्क प्रदर्शित करता है ।

आपको !nजेनेरिक प्रकार के n-वें प्रकार तर्क के रूप में पढ़ने की आवश्यकता है । कहाँ! 0 का अर्थ है "प्रथम प्रकार का तर्क"; 1 का अर्थ है "दूसरे प्रकार का तर्क", आदि। Nullable <> के लिए, आप जानते हैं कि MSDN लेख से '0' का अर्थ 'T' है।

आपका सामना कुछ इस तरह से भी हो सकता है !!T। दो विस्मयादिबोधक चिह्न एक सामान्य विधि के लिए एक प्रकार का तर्क दर्शाते हैं । इस बार, ildasm.exe उपयोग करने के बजाय टाइप तर्क नाम को देखता है !!0। प्रोग्रामर ने जेनेरिक प्रकारों पर शॉर्टकट क्यों लिया, लेकिन जेनेरिक तरीकों पर नहीं, रिवर्स-इंजीनियर के लिए कठिन है। Ildasm एक बहुत विचित्र कार्यक्रम है और C ++ कोडिंग शैली में लिखा गया है जो .NET में अन्य C ++ कोड से बहुत अलग है। अनुशासित नहीं, गैर-शून्य बाधाओं के रूप में यह एक आंतरिक काम था :)

"Nullable" पर `1 प्रत्यय सामान्य प्रकार के नामों के लिए एक सामान्य एन्कोडिंग है, यह इंगित करता है कि सामान्य प्रकार में एक प्रकार का तर्क है। दूसरे शब्दों में, Nullable <> के लिए आप कभी नहीं देखेंगे! 1 का उपयोग किया जा रहा है।

तो बस !0"टी" के रूप में पढ़ें । या एक बेहतर डीकंपोजर का उपयोग करें।


35

यह एक सामान्य प्रकार का पैरामीटर है।

वे स्थितिगत हैं।

यह देखने के लिए कुछ सामान्य कोड को डिकम्पाइल करें कि उनका उपयोग कैसे किया जाता है (IL बनाम C # की तुलना करें)।


5
यदि मैं TryRoslyn का उपयोग करता हूं तो मुझे यह नहीं मिलता है ... goo.gl/ZZKE38 मुझे मिलता है !Tऔर !!T, इसके आधार पर अगर सामान्य पैरामीटर युक्त वर्ग या विधि का है ... यदि मैं ildasm का उपयोग करता हूं
xanatos

@xanatos हमेशा नहीं। मैं भी तरह कोड को देखने ldfld class System.Collections.Generic.Dictionary``2<!0, !1> valuetype System.Collections.Generic.Dictionary``2/Enumerator<!TKey, !TValue>::dictionaryया call instance void class System.Collections.Generic.Dictionary``2<!TKey, !TValue>::Insert(!0, !1, bool)। कच्चे आईएल केवल वैसे भी स्थितीय तर्क का उपयोग करता है, हालांकि - !TKeyपहले से ही आईएल को अधिक पठनीय बनाने का प्रयास है। शायद यह हमेशा अच्छी तरह से काम नहीं करता है? ECMA युक्ति हमेशा स्थितीय !0/ !00साथ ही उपयोग करती है ।
लुआयन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.