यह सब एक चाल प्रश्न के साथ शुरू हुआ कि किसी ने मुझे देखा .. (पुस्तक में इसका उल्लेख है - सी # संक्षेप में) यहां इसकी जानकारी है।डबल का == ऑपरेटर कब आवेदित होता है?
Double a = Double.NaN;
Console.WriteLine(a == a); // => false
Console.WriteLine(a.Equals(a)); // => true
उपरोक्त सही नहीं लगता है। हमेशा अपने आप को == होना चाहिए (संदर्भ समानता) & दोनों को सुसंगत होना चाहिए।
लगता है जैसे == ऑपरेटर डबल ओवरलोड करता है। परावर्तक से इसकी पुष्टि इस प्रकार है:
[__DynamicallyInvokable]
public static bool operator ==(double left, double right)
{
return (left == right);
}
अजीब है कि पुनरावर्ती लग रहा है और NaN विशिष्ट व्यवहार का कोई जिक्र नहीं। तो यह झूठी क्यों लौटता है?
तो मैं
var x = "abc";
var y = "xyz";
Console.WriteLine(x == y); // => false
भेद करने के लिए कुछ और कोड जोड़ने अब मैं देख रहा हूँ
L_0001: ldc.r8 NaN
L_000a: stloc.0
L_000b: ldloc.0
L_000c: ldloc.0
L_000d: ceq
L_000f: call void [mscorlib]System.Console::WriteLine(bool)
L_0014: nop
L_0015: ldloca.s a
L_0017: ldloc.0
L_0018: call instance bool [mscorlib]System.Double::Equals(float64)
L_001d: call void [mscorlib]System.Console::WriteLine(bool)
L_0022: nop
L_0023: ldstr "abc"
L_0028: stloc.1
L_0029: ldstr "xyz"
L_002e: stloc.2
L_002f: ldloc.1
L_0030: ldloc.2
L_0031: call bool [mscorlib]System.String::op_Equality(string, string)
L_0036: call void [mscorlib]System.Console::WriteLine(bool)
-
डबल्स के लिए
- , == ऑपरेटर कॉल एक
ceq
आईएल opcode - जहां के रूप में करने के लिए अनुवाद तारों के लिए, यह सिस्टम.स्ट्रिंग :: op_Equality (स्ट्रिंग, स्ट्रिंग) में अनुवाद करता है।
निश्चित रूप से documentation for ceq
निर्दिष्ट करता है कि यह फ़्लोटिंग पॉइंट नंबर और NaN के लिए विशेषीकृत है। यह अवलोकन बताता है।
सवाल:
- क्यों op_Equality डबल पर परिभाषित किया गया है? (और कार्यान्वयन NaN विशिष्ट व्यवहार में कारक नहीं है)
- इसे कब लागू किया जाता है?
परावर्तक अक्सर ऐसी स्थितियों में विफल रहता है। मुझे लगता है कि 'ऑपरेटर ==' खुद को कॉल नहीं करता है, बल्कि आंतरिक रूप से 'ceq' का उपयोग करता है। – CodesInChaos
मुझे लगता है कि यह वही समस्या है जैसे http://stackoverflow.com/q/14458890/1236044 – jbl
@ jbl- वह सवाल पूछ रहा है कि क्यों 2 बराबर अलग-अलग परिणाम लौटाते हैं - जो मुझे लगता है। मेरा सवाल प्रतीत होता है कि अनावश्यक स्थिर op_equality कार्यान्वयन जो कभी नहीं कहा जाता है। – Gishu