दिलचस्प पोस्ट
पर्ल में एक स्ट्रिंग में फ़ाइल को गलाने का सबसे अच्छा तरीका क्या है? PHP वाक्यविन्यास में $ {} क्या मतलब है? मुझे ईमानदारी से शटडाउन प्रक्रियाओं को किस क्रम में भेजना चाहिए? बूलियन क्यों करता है। टॉस्ट्रिंग आउटपुट "ट्रू" और "सच" नहीं है PHP में क्लाइंट लोकेल का पता लगाने का सबसे सरल तरीका दोनों स्थानीय और दूरस्थ जीआईटी भंडार के लिए मास्टर शाखा का नाम बदलें जावा स्टैक आकार को कैसे बढ़ाएं? क्या इनलाइन वर्चुअल फ़ंक्शन वास्तव में एक अज्ञानता है? गतिशील प्रोग्रामिंग का उपयोग करते हुए सबसे लंबे समय तक बढ़ते हुए बदलाव का निर्धारण कैसे करें? JQuery प्लगइन्स का उपयोग करना जो कि डीओएम को रिएक्शन कॉम्पोनेंट्स में बदलता है? बैश स्क्रिप्ट हमेशा प्रिंट करता है "कमांड नहीं मिला" JTextField में वर्णों की संख्या को सीमित करना सीएसएस के साथ IE8 में सक्रिय हाइपरलिंक के आसपास बिंदीदार सीमा को कैसे निकालना जब मैं चुप मोड में ऑडियो चला रहा हूं और IOS 6 में लॉक करता हूं? एआरएम कॉर्टेक्स-ए 8 प्रोसेसर में कार्यक्रम निष्पादन समय को मापने के लिए कैसे?

सी # के बराबर मूल्य प्रकार की तुलना के साथ सी # ठीक है

मैं आज इस पर गया और पता नहीं क्यों सी # संकलक एक त्रुटि नहीं फेंक रहा है

Int32 x = 1; if (x == null) { Console.WriteLine("What the?"); } 

मैं इस बात के रूप में उलझन में हूँ कि कैसे एक्स संभवत: रिक्त हो सकता है खासकर जब से यह असाइनमेंट निश्चित रूप से एक कंपाइलर त्रुटि फेंकता है:

 Int32 x = null; 

क्या यह संभव है कि x रिक्त हो जाए, क्या माइक्रोसॉफ्ट ने इस चेक को कंपाइलर में नहीं डालने का फैसला किया, या यह पूरी तरह से चूक गया था?

अद्यतन: इस आलेख को लिखने के लिए कोड के साथ गड़बड़ करने के बाद, अचानक संकलक एक चेतावनी के साथ आया कि अभिव्यक्ति कभी भी सत्य नहीं होगी। अब मैं वास्तव में खो गया हूँ मैं ऑब्जेक्ट को एक क्लास में डाल दिया और अब चेतावनी समाप्त हो गई है, लेकिन सवाल के साथ छोड़ दिया, एक वैल्यू का प्रकार समाप्त हो सकता है

 public class Test { public DateTime ADate = DateTime.Now; public Test () { Test test = new Test(); if (test.ADate == null) { Console.WriteLine("What the?"); } } } 

वेब के समाधान से एकत्रित समाधान "सी # के बराबर मूल्य प्रकार की तुलना के साथ सी # ठीक है"

यह कानूनी है क्योंकि ऑपरेटर ओवरलोड संकल्प का चयन करने के लिए एक अनूठा सबसे अच्छा ऑपरेटर है। एक == ऑपरेटर है जो दो नल योग्य ints लेता है। इंट स्थानीय एक नल योग्य int के लिए परिवर्तनीय है शून्य शब्दशः एक नल योग्य int के लिए परिवर्तनीय है इसलिए यह == ऑपरेटर का कानूनी उपयोग है, और हमेशा इसका परिणाम झूठा होगा।

इसी प्रकार, हम आपको "if (x == 12.6)" कहने की भी अनुमति देते हैं, जो हमेशा झूठे होगा। इंट लोकल एक डबल के लिए परिवर्तनीय है, शाब्दिक रूप से एक डबल के लिए परिवर्तनीय है, और जाहिर है कि वे समान नहीं होंगे।

यह कोई त्रुटि नहीं है, क्योंकि एक ( int? ) रूपांतरण है; यह दिए गए उदाहरण में एक चेतावनी उत्पन्न करता है:

अभिव्यक्ति का नतीजा हमेशा 'झूठा' होता है क्योंकि टाइप 'इंट' का मान कभी '' अशक्त 'प्रकार' के समान नहीं होता?

यदि आप आईएल जांचते हैं, तो आप देखेंगे कि यह पूरी तरह से अप्राप्य शाखा को हटा देता है – यह रिलीज़ बिल्ड में मौजूद नहीं है

हालांकि ध्यान दें कि यह समानता ऑपरेटर के साथ कस्टम स्ट्रेंक्ट्स के लिए यह चेतावनी उत्पन्न नहीं करता है यह 2.0 में हुआ था, लेकिन 3.0 कंपाइलर में नहीं था कोड अभी भी हटा दिया गया है (इसलिए यह जानता है कि कोड पहुंच योग्य नहीं है), लेकिन कोई चेतावनी उत्पन्न नहीं की गई है:

 using System; struct MyValue { private readonly int value; public MyValue(int value) { this.value = value; } public static bool operator ==(MyValue x, MyValue y) { return x.value == y.value; } public static bool operator !=(MyValue x, MyValue y) { return x.value != y.value; } } class Program { static void Main() { int i = 1; MyValue v = new MyValue(1); if (i == null) { Console.WriteLine("a"); } // warning if (v == null) { Console.WriteLine("a"); } // no warning } } 

आईएल ( Main ) के MyValue(1) को छोड़कर सब कुछ ध्यान दें MyValue(1) (जो दुष्प्रभाव हो सकता है) हटा दिया गया है:

 .method private hidebysig static void Main() cil managed { .entrypoint .maxstack 2 .locals init ( [0] int32 i, [1] valuetype MyValue v) L_0000: ldc.i4.1 L_0001: stloc.0 L_0002: ldloca.sv L_0004: ldc.i4.1 L_0005: call instance void MyValue::.ctor(int32) L_000a: ret } 

यह मूल रूप से है:

 private static void Main() { MyValue v = new MyValue(1); } 

तथ्य यह है कि तुलना कभी भी सच नहीं हो सकती है इसका यह अर्थ नहीं है कि यह अवैध है बहरहाल, नहीं, एक मूल्य प्रकार कभी भी null हो सकता है।

नहीं, Int32 x कभी null नहीं होगा

यदि आप शून्य के लिए एक अंतर की तुलना कर रहे हैं तो तुलनात्मक ऑपरेटर जो दो इंट लेता है, वह लागू है।

"क्यों शून्य के साथ एक मूल्य प्रकार की तुलना एक चेतावनी है?" लेख आपकी मदद करेगा

एक मान प्रकार null नहीं हो सकता, हालांकि यह null बराबर हो सकता है ( Nullable<> विचार करें)। आपके मामले में, चर चर और null Nullable<Int32> रूप से Nullable<Int32> और तुलना की जाती है।

मुझे संदेह है कि आपके विशेष परीक्षण को संकलक द्वारा ऑप्टिमाइज़ किया जा रहा है जब यह आईएल बनाता है क्योंकि परीक्षण कभी भी गलत नहीं होगा।

साइड नोट: यह संभव है कि एक नल योग्य Int32 उपयोग Int32 है? बजाय x

मुझे लगता है क्योंकि "==" एक वाक्य रचना चीनी है जो वास्तव में सिस्टम को System.Object है। System.ObjectSystem.Object.Equals विधि जो सिस्टम को स्वीकार करती है। System.Object पैरामीटर ईसीएमए विनिर्देश द्वारा अशक्त एक विशेष प्रकार है, जो कि पाठ्यक्रम से प्राप्त होता है System.Object

यही कारण है कि केवल एक चेतावनी है

[संपादित करें: त्रुटियों में चेतावनियां कीं, और ऑपरेटरों को स्ट्रिंग हैक के बजाय रिक्त स्थान के बारे में स्पष्ट किया गया।]

उपरोक्त एक टिप्पणी में @ सुपरकाट के चतुर सुझाव के अनुसार, निम्न ऑपरेटर ओवरलोड आपको अपने कस्टम मान प्रकार की तुलना के बारे में त्रुटि उत्पन्न करने की अनुमति देते हैं।

ऑपरेटरों को लागू करने से, जो आपके प्रकार के नल योग्य संस्करणों की तुलना करता है, तुलना में नल का उपयोग ऑपरेटर के नल योग्य संस्करण से मेल खाता है, जो आपको अप्रचलित विशेषता के द्वारा त्रुटि उत्पन्न करने देता है।

जब तक माइक्रोसॉफ्ट हमें हमारे कंपाइलर चेतावनी को वापस नहीं भेजता, मैं इस समाधान के साथ जा रहा हूँ, धन्यवाद @ सुपरकैट!

 public struct Foo { private readonly int x; public Foo(int x) { this.x = x; } public override string ToString() { return string.Format("Foo {{x={0}}}", x); } public override int GetHashCode() { return x.GetHashCode(); } public override bool Equals(Object obj) { return x.Equals(obj); } public static bool operator ==(Foo a, Foo b) { return ax == bx; } public static bool operator !=(Foo a, Foo b) { return ax != bx; } [Obsolete("The result of the expression is always 'false' since a value of type 'Foo' is never equal to 'null'", true)] public static bool operator ==(Foo a, Foo? b) { return false; } [Obsolete("The result of the expression is always 'true' since a value of type 'Foo' is never equal to 'null'", true)] public static bool operator !=(Foo a, Foo? b) { return true; } [Obsolete("The result of the expression is always 'false' since a value of type 'Foo' is never equal to 'null'", true)] public static bool operator ==(Foo? a, Foo b) { return false; } [Obsolete("The result of the expression is always 'true' since a value of type 'Foo' is never equal to 'null'", true)] public static bool operator !=(Foo? a, Foo b) { return true; } } 

मुझे लगता है कि संकलक को स्वीकार करता है कि यह सामान्य वर्गों के लिए क्यों सबसे अच्छा जवाब है। निम्नलिखित वर्ग पर विचार करें …

 public class NullTester<T> { public bool IsNull(T value) { return (value == null); } } 

यदि कंपाइलर मूल्य प्रकारों के लिए null तुलना को स्वीकार नहीं करता है, तो यह अनिवार्य रूप से इस वर्ग को तोड़ देगा, जिसके पास एक प्रकार की बाधा उसके प्रकार पैरामीटर से जुड़ी होगी (अर्थात यह केवल गैर-मूल्य-आधारित प्रकारों के साथ काम करेगा)।