संभव डुप्लिकेट शून्य पर:
C# okay with comparing value types to nullतुलना structs
मैं एक बहु-क्रम वातावरण में एक विंडोज़ अनुप्रयोग पर काम कर रहा था और कभी कभी अपवाद "Invoke या BeginInvoke नियंत्रण पर नहीं कहा जा सकता मिलेगा जब तक खिड़की हैंडल नहीं बनाया गया है। " तो मुझे लगा कि मैं बस कोड की इस पंक्ति को जोड़ूंगा:
if(this.Handle != null)
{
//BeginInvokeCode
}
लेकिन इससे समस्या हल नहीं हुई। तो मैंने थोड़ा आगे खोला, और महसूस किया कि IntPtr (जिस प्रकार फॉर्म। हैंडल है) एक ऐसी संरचना है जो शून्य नहीं हो सकती है। यह ठीक था जो काम करता था:
if(this.Handle != IntPtr.Zero)
{
//BeginInvokeCode
}
तो फिर यह मुझे मारा, जब मैं इसे शून्य के लिए जांच रहा था तब भी संकलन क्यों किया? तो मैं इसे अपने आप कोशिश करने का फैसला किया:
public struct Foo { }
और उसके बाद:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
और पर्याप्त यकीन है कि यह कह रही है कि "त्रुटि 1 ऑपरेटर '==' प्रकार के ऑपरेंड के लिए लागू नहीं किया जा सकता संकलन नहीं किया 'ConsoleAplication1.Foo' और '' '। ठीक है, तो मैंने IntPtr के लिए मेटाडेटा को देखना शुरू कर दिया और IntPtr संरचना (ISerializable, ComVisible) में मौजूद मेरी Foo संरचना में सब कुछ जोड़ना शुरू कर दिया लेकिन कुछ भी मदद नहीं की। ! अंत में, जब मैं == के ऑपरेटर ओवरलोडिंग जोड़ा गया है और =, यह काम किया:
[Serializable]
[ComVisible(true)]
public struct Foo : ISerializable
{
#region ISerializable Members
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
throw new NotImplementedException();
}
#endregion
public override bool Equals(object obj)
{
return base.Equals(obj);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
public static bool operator ==(Foo f1, Foo f2) { return false; }
public static bool operator !=(Foo f1, Foo f2) { return false; }
}
यह अंत में संकलित:
static void Main(string[] args)
{
Foo f = new Foo();
if (f == null) { }
}
मेरा प्रश्न क्यों है? क्यों आप ओवरराइड == और! = क्या आपको शून्य से तुलना करने की अनुमति है? == और! = के पैरामीटर अभी भी प्रकार के फू हैं जो शून्य नहीं हैं, तो यह अचानक क्यों अनुमति देता है?
अच्छे प्रश्न btw के लिए +1, और साथी ब्रुकलिनसाइट से हैलो :) –