MSDN==
में ऑपरेटर के प्रलेखन के अनुसार ,
पूर्वनिर्धारित मूल्य प्रकारों के लिए, समानता ऑपरेटर (==) सही साबित होता है यदि उसके ऑपरेंड के मूल्य समान हैं, अन्यथा झूठे हैं। स्ट्रिंग के अलावा अन्य संदर्भ प्रकारों के लिए, == सही है यदि इसके दो ऑपरेंड एक ही ऑब्जेक्ट को संदर्भित करते हैं। स्ट्रिंग प्रकार के लिए, == स्ट्रिंग्स के मूल्यों की तुलना करता है। उपयोगकर्ता-परिभाषित मूल्य प्रकार == ऑपरेटर (ऑपरेटर देखें) को अधिभारित कर सकते हैं। तो उपयोगकर्ता-परिभाषित संदर्भ प्रकार, हालांकि डिफ़ॉल्ट रूप से == पूर्वनिर्धारित और उपयोगकर्ता-परिभाषित संदर्भ प्रकार दोनों के लिए ऊपर वर्णित अनुसार व्यवहार करते हैं।
तो यह कोड स्निपेट संकलन में विफल क्यों है?
bool Compare<T>(T x, T y) { return x == y; }
मुझे त्रुटि ऑपरेटर '==' टाइप 'T' और 'T' के ऑपरेंड पर लागू नहीं किया जा सकता है । मुझे आश्चर्य है कि क्यों, जहां तक मैं समझता हूं कि ==
ऑपरेटर सभी प्रकार के लिए पूर्वनिर्धारित है?
संपादित करें: धन्यवाद, सब लोग। मैंने पहले यह नहीं देखा कि बयान केवल संदर्भ प्रकारों के बारे में था। मैंने यह भी सोचा कि बिट-बाय-बिट तुलना सभी प्रकार के प्रकारों के लिए प्रदान की जाती है, जो अब मैं जानता हूं कि यह सही नहीं है।
लेकिन, यदि मैं एक संदर्भ प्रकार का उपयोग कर रहा हूं, तो क्या ==
ऑपरेटर पूर्वनिर्धारित संदर्भ तुलना का उपयोग करेगा, या क्या यह ऑपरेटर के अतिभारित संस्करण का उपयोग करेगा यदि कोई प्रकार परिभाषित किया गया है?
संपादन 2: परीक्षण और त्रुटि के माध्यम से, हमने पाया कि ==
ऑपरेटर अप्रतिबंधित जेनेरिक प्रकार का उपयोग करते समय पूर्वनिर्धारित संदर्भ तुलना का उपयोग करेगा। वास्तव में, कंपाइलर सबसे अच्छे तरीके का उपयोग करेगा जो इसे प्रतिबंधित प्रकार के तर्क के लिए मिल सकता है, लेकिन आगे नहीं दिखेगा। उदाहरण के लिए, नीचे दिया गया कोड हमेशा प्रिंट होगा true
, यहां तक कि जब Test.test<B>(new B(), new B())
कहा जाता है:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
एक ही प्रकार के दो ऑपरेंड के बीच अनुमति नहीं है। यह struct
प्रकारों के लिए सच है ("पूर्व-परिभाषित" प्रकारों को छोड़कर) जो ओवरलोड नहीं करते हैं operator ==
। एक सरल उदाहरण के रूप में, यह कोशिश करें:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
तब, आप जाँच नहीं कर सकते kvp1 == kvp2
क्योंकि KeyValuePair<,>
एक संरचना है, यह C # पूर्व-निर्धारित प्रकार नहीं है, और यह ओवरलोड नहीं करता है operator ==
। फिर भी एक उदाहरण दिया गया var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
है जिसके साथ आप ऐसा नहीं कर सकते हैं e1 == e2
(यहां हमारे पास नेस्टेड स्ट्रक्चर List<>.Enumerator
( "List`1+Enumerator[T]"
रनटाइम द्वारा कॉल किया गया है) जो ओवरलोड नहीं करता है ==
)।
bool
से नहीं लौट सकते void
...