2012-07-13 7 views
7

मैं एक आईएल स्थिर विश्लेषण उपकरण लिख रहा हूँ, और मैं एक कठिन समय को नियंत्रित करने के लिए कैसे सामान्य प्रकार पैरामीटर संदर्भित नियमों को समझने आ रही हैं:आईएल जेनेरिक - कब के लिए नियम मौजूद हैं! टी का उपयोग बनाम बनाम 0 है?

(IList<T> interface से) इस आईएल ले:

.property instance !T Item(
    int32 index 
) 
{ 
    .get instance !0 System.Collections.Generic.IList`1::get_Item(int32) 
    .set instance void System.Collections.Generic.IList`1::set_Item(int32, !0) 
} 

!T के बजाय वहां क्यों है? मुझे लगता है कि वे वीएम के बराबर हैं, जब आप नाम रखने की गारंटी रखते हैं तो यह स्थितित्मक संदर्भों का उपयोग करने के लिए अजीब लगता है।

अद्यतन: एक KeyedCollection.ctor से अतिरिक्त मामले,:

IL_0037: newobj instance void class System.Collections.Generic.Dictionary`2<!TKey,!TItem>::'.ctor'(class System.Collections.Generic.IEqualityComparer`1<!0>) 
IL_003c: stfld class System.Collections.Generic.Dictionary`2<!0,!1> class System.Collections.ObjectModel.KeyedCollection`2<!0,!1>::dictionary 
+0

मुझे यह नहीं दिखाई देता है। क्या आपको यकीन है कि यह आपके डिस्सेबलर में सिर्फ एक बग नहीं है? –

+0

एचएम, यह निश्चित रूप से कुछ असंतुलित है (इस मामले में मोनोडिस) उत्पन्न हो रहा है। Mono.Cecil (जो कि मेटाडाटा-वार द्वारा अधिक से अधिक प्रतीत होता है) दिखाता है, उदाहरण के लिए: stfld System.Collections.Generic.Dictionary'2 सिस्टम। चयन। ऑब्जेक्टमोडेल.केड कोलेक्शन'2 :: शब्दकोश – toshok

+0

@ हंसपैसेंट आपको आईएल दिखाने के लिए आप क्या उपयोग कर रहे हैं? – casperOne

उत्तर

4

Common Language Infrastructure standard, Partition II - Metadata and File Format, खंड 7.1 "प्रकार" में यह कहा गया है:

Type ::=  Description 
--------  ----------- 
'!'    Generic parameter in a type definition, accessed by index from 0 

तो संक्षिप्त उत्तर: क्योंकि यह कल्पना में है।

लंबा उत्तर: यह मेरे हिस्से पर अटकलें है, लेकिन मूल रूप से, अधिकांश आईएल कमांड स्टैक-आधारित हैं और हर समय पैरामीटर के रूप में स्थितित्मक संदर्भों का उपयोग करते हैं। उस ने कहा, यह समझ में आता है कि आईएल में सामान्य पैटर्न/उपयोग तंत्र को बनाए रखने के लिए जेनेरिक के लिए स्थितित्मक संदर्भों का उपयोग किया जाता है।

+0

तो जब 'टी 'का उपयोग किया जाता है? – svick

+0

@ एसविक यह नहीं है, इसका उपयोग केवल घोषणा के लिए किया जाता है। मेटाडेटा में नाम रखने का बिंदु टाइप पैरामीटर के नाम को संरक्षित करना है, लेकिन जहां यह * प्रयुक्त * है, इसे स्थिति द्वारा एक्सेस किया जाता है। – casperOne

+0

जो अभी भी बहुत भ्रमित है। ! टी का उपयोग संपत्ति के लिए घोषणा में किया जाता है लेकिन यह उसी जेनेरिक पैरामीटर का जिक्र कर रहा है जो 0 करता है। क्या मुझे लगता है कि वे पूरी तरह से विनिमय योग्य हैं? – toshok

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