2010-07-20 11 views
16

IEquatable < टी > टी में contravariant होने की घोषणा की जा सकती थी, क्योंकि यह केवल एक इनपुट स्थिति में टी का उपयोग करता है (या, समतुल्य रूप, यू टी की एक उप-प्रकार किया जा रहा मतलब होना चाहिए कि IEquatable < टी > है IEquatable [का एक उप-प्रकार] < यू >)।आईईक्वेटेबल टी ने सी # 4.0 के लिए टी में contravariant क्यों नहीं बनाया था?

तो, बीसीएल टीम ने 'इन' कीवर्ड के साथ (सी # 4.0 के लिए) एनोटेट क्यों नहीं किया, जैसा कि उन्होंने कई अन्य सामान्य इंटरफेस (जैसे पूरी तरह से समान आईसीओपरपेबल) के साथ किया था?

+0

समस्याओं में धागा [चाहिए 'IEquatable ', 'IComparable ' गैर 'sealed' वर्गों पर लागू किया जा?] (Http://stackoverflow.com/questions/1868316/should-iequatablet-icomparablet- उल्लेख किया गैर-मुहरबंद-कक्षाओं पर लागू हो) यदि 'IEquatable <>' contravariant था तो बस बहुत खराब हो जाएगा। –

उत्तर

13

मुझे लगता है कि यह मुख्य रूप से तकनीकी सीमा – की बजाय दार्शनिक कारण के लिए है क्योंकि यह इंटरफ़ेस को केवल एनोटेट करना संभव है। IEquatable<T> सटीक समानता के लिए एक ही प्रकार की वस्तुओं की तुलना करने के लिए है। सुपरक्लास का एक उदाहरण आमतौर पर सबक्लास के उदाहरण के बराबर नहीं माना जाता है। इस अर्थ में समानता का अर्थ समानता समानता है। यह IComparable<in T> से थोड़ा अलग है। विभिन्न प्रकारों में रिश्तेदार सॉर्ट ऑर्डर को परिभाषित करने के लिए समझदार हो सकता है। Implementers को

नोट्स::

MSDN page on IEquatable<T> के शब्दों में

प्रकार है कि इस इंटरफेस लागू कर रहा है साथ IEquatable<T> अंतरफलक के प्रकार पैरामीटर बदलें।

यह वाक्य आगे इस तथ्य को दर्शाता है कि IEquatable<T> एक ठोस प्रकार के उदाहरणों के बीच काम करने के लिए है।

+0

धन्यवाद; मुझे संदेह है कि यह सच के करीब है। यह एक शर्म की बात है, हालांकि, यू वास्तव में टी का उपप्रकार होने का मतलब है कि आईक्वेटेबल टी यू के बराबर है ... यह सिर्फ यू के लिए IEquatable नहीं है! दूसरे शब्दों में, मुझे इंटरफ़ेस को एनोटेट करने के लिए कोई नकारात्मक पक्ष नहीं दिख रहा है ... –

+0

मैं ईमानदारी से इसे contravariant बनाने के लिए * ऊपर * नहीं देखता। यह कहना समझ में नहीं आता कि 'वाहन' का एक उदाहरण 'कार' का एक उदाहरण - प्रभावी रूप से समान रूप से समान है। वे सॉर्ट ऑर्डर के लिए समकक्ष हो सकते हैं (जैसा कि आईसीओपरपेबल के साथ), लेकिन वे वास्तव में कभी भी "बराबर" नहीं होंगे। –

+1

@ खालिद: यह मानते हुए कि एक आदर्श आधार प्रकार को अपने व्युत्पन्न प्रकारों के ब्योरे के बारे में पता नहीं होना चाहिए, यह उन प्रकारों की समानता तय करने की स्थिति में नहीं है। एक व्युत्पन्न वर्ग कुछ गुण जोड़ सकता है, इस प्रकार आधार वर्ग प्रदान करता है समानता परिभाषा से अलग हो रहा है। –

1

विरासत प्रकार आमतौर पर IEquatable<T> लागू नहीं करना चाहिए। यदि IEquatable<T> में GetHashCode() विधि शामिल है, तो कोई यह कहने के लिए IEquatable<T> के अर्थशास्त्र को परिभाषित कर सकता है कि टी के रूप में जांच किए जाने पर आइटमों की तुलना बराबर की जानी चाहिए। दुर्भाग्यवश, तथ्य यह है कि IEquatable<T> एक ही हैश कोड के लिए बाध्य है Object.Equals का अर्थ है कि सामान्य रूप से IEquatable<T> को अनिवार्य रूप से उसी semantics को Object.Equals के रूप में लागू करना होगा।

नतीजतन, IEquatable<BaseClass> के एक कार्यान्वयन के भीतर कॉल Object.Equals के अलावा और कुछ है, तो एक व्युत्पन्न वर्ग जो Object.Equals ओवरराइड करता है और GetHashCode() और नहीं करता है फिर से लागू IEquatable<BaseClass> कि इंटरफेस की एक टूटी हुई कार्यान्वयन के साथ खत्म हो जाएगा; IEquatable<BaseClass> का कार्यान्वयन जो बस Object.Equals पर कॉल करता है, उस परिदृश्य में भी ठीक काम करेगा, लेकिन उस वर्ग पर कोई वास्तविक लाभ नहीं देगा जो IEquatable<T> लागू नहीं करता है।

यह देखते हुए कि विरासत योग्य वर्गों को पहले स्थान पर IEquatable<T> लागू नहीं किया जाना चाहिए, कॉन्वर्सिस की धारणा इंटरफ़ेस के उचित कार्यान्वयन के लिए प्रासंगिक नहीं है।

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