2010-10-17 21 views
34

यह स्पष्ट कलाकार Specified cast is not valid. अपवाद क्यों फेंकता है?क्यों (int) (ऑब्जेक्ट) 10 मीटर फेंक देता है "निर्दिष्ट कास्ट मान्य नहीं है" अपवाद?

decimal d = 10m; 
object o = d; 
int x = (int)o; 

लेकिन यह काम करता है:

object o = d; 

आप बिना बॉक्सिंग मूल्यों सीधे डाली नहीं कर सकते हैं:

int x = (int)(decimal)o; 
+1

संभव डुप्लिकेट [? मैं एक दशमलव के रूप में एक पूर्णांक Unbox क्यों नहीं कर पा] (http://stackoverflow.com/questions/1085097/why-cant-i: जो आप बदलना वर्ग का उपयोग करके आह्वान -unbox-an-int-as-a-दशमलव) – nawfal

उत्तर

59

एक बॉक्स किए गए मान को उसी प्रकार के चर के लिए केवल अनबॉक्स किया जा सकता है। यह प्रतीत होता है कि अजीब प्रतिबंध एक बहुत ही महत्वपूर्ण गति अनुकूलन है जिसने जेनेरिक उपलब्ध होने से पहले .NET 1.x को व्यवहार्य बना दिया था। आप this answer में इसके बारे में अधिक पढ़ सकते हैं।

आपको एकाधिक कास्ट हुप के माध्यम से कूदने की ज़रूरत नहीं है, सरल मूल्य प्रकार IConvertible इंटरफ़ेस को लागू करते हैं।

 object o = 12m; 
     int ix = Convert.ToInt32(o); 
की
+0

बहुत प्यारी! मैं इस सुबह सुबह से अपने सिर को बर्बाद कर रहा था। – RBT

15

जब आप ऐसा करते हैं, तो आप परोक्ष दशमलव d एक बुनियादी वस्तु को मुक्केबाजी रहे हैं पहले उन्हें अनबॉक्सिंग, यही कारण है कि निम्न में से एक int को सीधे डालना, विफल रहता है:

int x = (int)o; 

हालांकि, ऐसा करने (intermediately एक दशमलव पहला कास्टिंग) द्वारा:

int x = (int)(decimal)o; 

आप पहली बार unboxing o जिसका मतलब है कि आप अनबॉक्स्ड दशमलव मान कास्टिंग दशमलव मान, पुन: प्राप्त करने कर रहे हैं तो कर रहे हैं, एक int के लिए, जो काम करता है क्योंकि सी # इंक को कास्टिंग decimals का समर्थन करता है।

6

decimal में explicit cast operator से int है। object नहीं करता है:

decimal d = 10m; 
object o = d; 
int x = (int)d; // OK, calls decimal.explicit operator int(d). 
int y = (int)o; // Invalid cast. 
3

क्या तुम यहाँ के बारे में सोच की जरूरत है कि मुक्केबाजी और unboxing वास्तव में रूपांतरण का एक प्रकार नहीं है। आप प्रारंभिक दशमलव प्रकार के "ऑब्जेक्ट प्रकार" ऑब्जेक्ट प्रकार को "लपेटें"। यही कारण है कि आप इसे पहले एक ऑब्जेक्ट में कनवर्ट करने में सक्षम होने से पहले ऑब्जेक्ट को अनबॉक्स करना होगा।

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