2012-04-30 12 views
6

नीचे कोड पिछले काम में विफल रहता है:सी # int- या आपत्ति करने वाली डबल कास्टिंग त्रुटि स्पष्टीकरण

static void Main(string[] args) 
{ 
    int a = 5; 
    object b = 5; 

    System.Diagnostics.Debug.Assert(a is int && b is int); 

    double x = (double)a; 
    double y = (double)b; 
} 

यदि दोनों ए और बी int कर रहे हैं, इस त्रुटि का कारण क्या है?

+0

संभावित बॉक्सिंग [बॉक्सिंग मूल्य कास्टिंग] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/5312731/casting-a-boxed-value) – Brian

उत्तर

15

बॉक्स से निकालना सही प्रकार की आवश्यकता है - आप इस के बजाय कर सकते हैं:

double y = (double)(int)b; 
+0

दिलचस्प। धन्यवाद! – digdig

20

यह एक बहुत ही अक्सर पूछे जाने वाले प्रश्न है। स्पष्टीकरण के लिए http://blogs.msdn.com/b/ericlippert/archive/2009/03/19/representation-and-identity.aspx देखें।


स्निपेट:

मैं सी # डाली ऑपरेटर के बारे में सवाल का एक उचित संख्या मिलता है। सबसे लगातार सवाल मुझे मिलता है:

short sss = 123; 
object ooo = sss;   // Box the short. 
int iii = (int) sss;   // Perfectly legal. 
int jjj = (int) (short) ooo; // Perfectly legal 
int kkk = (int) ooo;   // Invalid cast exception?! Why? 

क्यों? चूंकि एक बॉक्स किए गए T को केवल T पर अनबॉक्स किया जा सकता है। (*) एक बार यह अनबॉक्स हो जाने पर, यह केवल एक मान है जिसे सामान्य रूप से डाला जा सकता है, इसलिए डबल कास्ट ठीक काम करता है।

(*) या Nullable<T>

0

a एक int है, लेकिन b एक वस्तु है कि एक int है के लिए एक संदर्भ है - यह क्या एक बॉक्सिंग पूर्णांक कहा जाता है। वे दो अलग-अलग चीजें हैं, इसलिए विभिन्न व्यवहार हैं।

1

लागू कास्टिंग एक संकलन-समय ऑपरेशन है। के b के लिए यह संभव नहीं है।

संबंधित मुद्दे