कई संदर्भों में जहां एक विधि या ऑपरेटर तर्क आवश्यक प्रकार का नहीं है, C # संकलक एक अंतर्निहित प्रकार रूपांतरण करने का प्रयास करेगा। यदि संकलक सभी रूपांतरणों को जोड़कर अपने संचालकों और तरीकों को संतुष्ट कर सकता है, तो यह शिकायत के बिना ऐसा करेगा, भले ही कुछ मामलों में (विशेषकर समानता परीक्षण के साथ!) परिणाम आश्चर्यजनक हो सकते हैं।
इसके अलावा, प्रत्येक मूल्य प्रकार जैसे कि int
या short
वास्तव में एक प्रकार का मूल्य और एक प्रकार की वस्तु (*) दोनों का वर्णन करता है। निहित रूपांतरण, मूल्यों को अन्य प्रकार के मूल्यों में परिवर्तित करने के लिए, और किसी भी प्रकार के मूल्य को अपनी इसी प्रकार की वस्तु में परिवर्तित करने के लिए मौजूद हैं, लेकिन विभिन्न प्रकार की वस्तुएं एक दूसरे के लिए अनुमानित रूप से परिवर्तनीय नहीं हैं।
एक का उपयोग करता है ==
एक तुलना करने के लिए ऑपरेटर short
और एक int
, short
परोक्ष एक में परिवर्तित हो जाएगा int
। यदि इसका संख्यात्मक मान इसके बराबर था int
, तो int
इसे जिस रूप में परिवर्तित किया गया था int
, वह उसकी तुलना में समान होगा । यदि कोई Equals
इसे के साथ तुलना करने के लिए शॉर्ट पर विधि का उपयोग करने का प्रयास करता है int
, हालांकि, केवल अंतर्निहित रूपांतरण जो Equals
विधि के अधिभार को संतुष्ट करेगा, उसी के अनुरूप ऑब्जेक्ट प्रकार में रूपांतरण होगा int
। जब short
पूछा जाता है कि क्या यह पारित कर दिया-वस्तु से मेल खाता है, यह निरीक्षण है कि प्रश्न में वस्तु एक है जाएगा int
बल्कि एक से short
और इस प्रकार निष्कर्ष है कि यह संभवतः बराबर नहीं हो सकता।
सामान्य तौर पर, हालांकि संकलक इसके बारे में शिकायत नहीं करेगा, लेकिन किसी को उन चीजों की तुलना करने से बचना चाहिए जो एक ही प्रकार के नहीं हैं; अगर किसी की दिलचस्पी सामान्य रूप में चीजों के रूपांतरण के रूप में है, तो वही परिणाम देगा, इस तरह के रूपांतरण को स्पष्ट रूप से करना चाहिए। उदाहरण के लिए विचार करें,
int i = 16777217;
float f = 16777216.0f;
Console.WriteLine("{0}", i==f);
तीन तरीके हैं जिनमें से एक की तुलना करना चाहते हो सकता int
हैfloat
। एक जानना चाहते हो सकता है:
- क्या निकटतम संभव
float
मान हैint
मैच केfloat
?
- की पूरी-संख्या का हिस्सा है
float
मैच है int
?
int
और करोfloat
एक ही संख्यात्मक मान का प्रतिनिधित्व ।
यदि कोई सीधे int
और float
सीधे तुलना करने की कोशिश करता है , तो संकलित कोड पहले प्रश्न का उत्तर देगा; क्या यह है कि प्रोग्रामर का इरादा है, हालांकि, स्पष्ट से दूर हो जाएगा। तुलना बदलने से (float)i == f
यह स्पष्ट हो जाएगा कि पहला अर्थ इरादा था, या (double)i == (double)f
तीसरे प्रश्न का उत्तर देने के लिए कोड का कारण होगा (और यह स्पष्ट करें कि वह क्या था)।
(*) भले ही C # कल्पना प्रकार का एक मान मानती है , जैसे कि एक System.Int32
प्रकार की वस्तु होने के नाते System.Int32
, इस तरह के एक दृश्य को इस आवश्यकता के विपरीत माना जाता है कि एक कोड एक मंच पर चलता है जिसकी कल्पना मूल्यों और वस्तुओं को विभिन्न ब्रह्मांडों का निवास मानती है। इसके अलावा, यदि T
एक संदर्भ प्रकार है, और x
एक है T
, तो प्रकार का एक संदर्भ T
संदर्भित करने में सक्षम होना चाहिए x
। इस प्रकार, यदि एक v
प्रकार Int32
का चर एक धारण करता है Object
, तो प्रकार का Object
एक संदर्भ v
या उसकी सामग्री के संदर्भ में सक्षम होना चाहिए । वास्तव में, प्रकार का एक संदर्भ Object
डेटा से कॉपी किए गए किसी ऑब्जेक्ट को इंगित करने में सक्षम होगा v
, लेकिन v
स्वयं को और न ही इसकी सामग्री को। यह सुझाव देगा कि न तोv
और न ही इसकी सामग्री वास्तव में एक है Object
।