मुझे हाल ही में आश्चर्य हुआ कि संकलक इंटरफ़ेस संदर्भों की तुलना करने के बारे में सख्ती से सख्त नहीं है और मुझे आश्चर्य है कि यह इस तरह क्यों काम करता है।असंबद्ध सी # इंटरफ़ेस संदर्भों को संकलक त्रुटि के बिना क्यों तुलना की जा सकती है?
इस कोड पर विचार करें:
class Program
{
interface I1 {}
interface I2 {}
class C1 : I1 {}
class C2 : I2 {}
static void Main(string[] args)
{
C1 c1 = new C1();
C2 c2 = new C2();
I1 i1 = c1;
I2 i2 = c2;
bool x = c1 == c2;
bool y = i1 == i2;
}
}
संकलक का कहना है कि मैं c1 == c2
तुलना नहीं कर सकते, जो इस प्रकार है। प्रकार पूरी तरह से असंबंधित हैं। फिर भी, यह मुझे i1 == i2
की तुलना करने की अनुमति देता है। मैं संकलन-समय विफलता के साथ यहां त्रुटि करने की उम्मीद करता हूं लेकिन मुझे यह जानकर आश्चर्य हुआ कि आप किसी भी इंटरफ़ेस की तुलना किसी अन्य से कर सकते हैं और संकलक कभी शिकायत नहीं करेगा। मैं तुलना कर सकता हूं, उदाहरण के लिए (I1)null == (IDisposable)null
और कोई समस्या नहीं है।
इंटरफेस ऑब्जेक्ट्स नहीं हैं? क्या वे एक विशेष प्रकार का संदर्भ हैं? मेरी उम्मीद यह होगी कि ==
परिणामस्वरूप सीधे संदर्भ तुलना या कंक्रीट क्लास के आभासी बराबर में कॉल होगा।
मुझे क्या याद आ रही है?
जानकारी के लिए, '==' आमतौर पर op_Equality ऑपरेटर से जुड़ा होता है, न कि आभासी बराबर (प्लस संदर्भ तुलना, लेकिन आप पहले से ही इसे कवर करते हैं) –