कई संदर्भों में जहां एक विधि या ऑपरेटर तर्क आवश्यक प्रकार का नहीं है, 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।