2016-03-11 10 views
18

जब IReadOnlyList<T> .NET 4.5 में पेश किया गया था, एक पल के लिए मैंने सोचा था कि पहेली का लापता हिस्सा आखिरकार जगह में डाला गया था: एक सच्चे पठनीय सूचकांक इंटरफ़ेस को पारित करने का एक तरीका जहां पहले मुझे अपने स्वयं के पढ़ने-योग्य इंटरफेस का उपयोग करना होगा और सब कुछ के चारों ओर रैपर वर्ग बनाते हैं। ,`ILead <T>` `IReadOnlyList <T>` से प्राप्त नहीं है?

IEnumerable<T> 
.GetEnumerator() 
     -> IReadOnlyCollection<T> : IEnumerable<T> 
     .Count 
      -> IReadOnlyList<T> : IReadOnlyCollection<T> 
      .Item[...] 
        -> IList<T> : IReadOnlyList<T> 
        .Add(...) 
        .Clear() 
        .Contains(...) 
        (etc) 

लेकिन के रूप में यह पता चला है, IList<T>IReadOnlyList<T> से विरासत नहीं करता है:

मैं इंटरफ़ेस उम्मीद कर रहा था "प्राकृतिक" पदानुक्रम है, जो आदर्श होगा अंदर रखा करने के लिए किया जा।

क्या इसके लिए कोई कारण है?

+7

जैसा कि आपने पहले ही कहा है कि 'आईआरडोनलीलिस्ट' .NET4.5 में पेश किया गया था, जिस तरह से बाद में 'IList' को .NET में जोड़ा गया था। – HimBromBeere

+4

इसे जांचें: https://social.msdn.microsoft.com/Forums/vstudio/en-US/b4fb991a-3f5c-4923-93d4-7cd5c004f859/new-interfaces-ireadonlylist-and-ireadonlydictionary?forum=netfxbcl –

+6

'सूची <> 'लागू 'IList <>' लेकिन यह केवल पढ़ने के लिए नहीं है, तो इसे 'IReadOnlyList <>' क्यों लागू करना चाहिए? –

उत्तर

23

@ w.b टिप्पणी है कि एक जवाब होता है में New interfaces IReadOnlyList and IReadOnlyDictionary का लिंक रख:

क्यों हम केवल पढ़ने के लिए इंटरफेस का विस्तार करने के मौजूदा इंटरफेस परिवर्तन नहीं किया?

यह एक उचित धारणा की तरह दिखता है कि यह काम करता है क्योंकि केवल पढ़ने के लिए इंटरफेस रीड-राइट इंटरफेस का सबसेट है। दुर्भाग्यवश, यह असंगत है क्योंकि मेटाडेटा स्तर पर प्रत्येक इंटरफ़ेस पर प्रत्येक विधि का अपना स्लॉट होता है (जो स्पष्ट इंटरफ़ेस कार्यान्वयन करता है)।


इममो लैंडवर्थ | .NET फ्रेमवर्क टीम (बीसीएल) | http://blogs.msdn.com/b/bclteam/

में थोड़ा और अधिक स्पष्ट रूप से यह समझाने के लिए:

मान लीजिए कि एक कार्यक्रम .NET 4.0 के लिए लिखा एक वर्ग MyList<T> कि IList<T> लागू करता है शामिल हैं। यह स्पष्ट रूप से IReadOnlyList<T> लागू नहीं कर सकता क्योंकि यह इंटरफ़ेस मौजूद नहीं है।

अब मान लें कि सिस्टम व्यवस्थापक .NET 4.5 स्थापित करता है और मान लीजिए कि .NET 4.5 बनाया गया IList<T>IReadOnlyList<T> लागू करें।

कार्यक्रम तो लोड किया जा चाहते हैं, तो क्रम का पता लगाने होता है कि MyList<T> दावों IList<T> लागू करने के लिए, लेकिन वास्तव में सभी तरीकों को लागू नहीं करता है: यह IReadOnlyList<T> के तरीकों को लागू नहीं करता है। कार्यक्रम अब काम नहीं करेगा।

सी # कंपाइलर नाम से विधियों से मिलान करने में सक्षम हो सकता है, लेकिन रनटाइम ऐसा नहीं करता है। चूंकि .NET 4.5 को पीछे की बाइनरी संगतता माना जाता था, इसलिए अन्य इंटरफेस को लागू करने के लिए इंटरफेस को बढ़ाया नहीं जा सकता था, भले ही उन अन्य इंटरफेस में आवश्यक विधियों का सख्त सबसेट शामिल न हो।

+2

+1 और स्पष्ट कार्यान्वयन के उद्धरण के संदर्भ के आधार पर एक और उदाहरण। यदि किसी वर्ग में पहले से ही एक स्पष्ट 'int IList है। गणना ... 'कार्यान्वयन और' IList '' IReadOnlyList 'से प्राप्त होगा, तो गणना उत्तरार्द्ध से संबंधित होगी और मौजूदा कार्यान्वयन विफल हो जाएगा, भले ही सही के साथ निर्माण हो ढांचा। –

+0

@ Me.Name यह एक अच्छा उदाहरण भी है, हालांकि मुझे लगता है कि कोई सी # के विस्तार के साथ हल हो सकता है। – hvd

+0

+1 अच्छी तरह से बकवास, मुझे लगता है कि यह ऐसा कुछ होगा। मुझे लगता है कि 'सूची ' और 'टी []' इसे लागू करने के लिए पर्याप्त है। – Lou

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