2009-11-03 11 views
7

कास्टिंग करते समय अमान्य कैस्ट एक्सेप्शन क्यों मिलता है मैं एक अनुप्रयोग को डीबग करने का प्रयास कर रहा हूं जो अमान्यकास्टएक्सप्शन प्राप्त करता है। ऐसा न करने पर लाइनमुझे दशमलव से

decimal d = (decimal)row[denominator]; 

डीबगर में इस निरीक्षण है (नीचे स्क्रीनशॉट देखें), पंक्ति [भाजक] मूल्य 8.0 जहाँ तक मैं बता सकता हूँ के साथ एक डबल रखती है। सख्ती से दशमलव पर कास्टिंग करने में कोई समस्या नहीं होनी चाहिए? एक ही क्वेरी -।

('पंक्ति' प्रकार 3. party library है, जो फिर से MySQL जब एक पुराने MySQL सर्वर जो जाहिरा तौर पर MySQL 5.1 पर दशमलव बनाम डबल के रूप में कुछ समुच्चय रिटर्न के खिलाफ परीक्षण मुद्दा arised से डेटा से भर जाता है से है डेटाबेस में डेटा की ठीक उसी प्रतिलिपि)

Visual Studio Screenshot http://img18.imageshack.us/img18/3897/invaldicast.png

कैसे मैं आगे इस की जांच कर सकता है पर कोई मदद?

+0

जो वापस किया जा रहा है वह एक ऐसा ऑब्जेक्ट प्रतीत होता है जिसमें डबल डबल नहीं होता है। – Lazarus

उत्तर

10

एरिक Lippert बारे में ब्लॉग किया वास्तव में इस गहराई में मैं मानता हूँ यह पहली बार में unintuitive है, लेकिन वह यह अच्छी तरह से बताते हैं: Representation and Identity

3

आप उपयोग कर सकते हैं:

double d1 = (double)row[denominator]; 
decimal d = (decimal) d1; 

या, जाहिर है, इसे इतना छोटा है कि:

decimal d = (decimal) (double)(row[denominator]); 

क्योंकि वहाँ एक unboxing शामिल कदम है, तो आप 2 कदम की जरूरत है।

2

इसे पहले double पर कास्ट करने का प्रयास करें। row[denominator] बॉक्स किया गया है, इसलिए decimal पर सीधे कास्ट काम नहीं करेगा।

6

आप row[denominator] के रूप में एक डबल पहले करने के लिए इसे कास्ट करने के लिए की जरूरत है एक डबल एक वस्तु अर्थात

decimal d = (decimal)((double)row[denominator]); 
3

एक सुझाव के रूप में बॉक्सिंग है: प्रत्यक्ष कास्टिंग के बजाय Convert.ToDecimal (आज़मा कर देखें)।

4

मैं कोशिश करता हूँ

decimal d = Convert.ToDecimal(row[denominator]); 

या

decimal d = 0; 
if (!decimal.TryParse(row[denominator], out d)) 
    //do something 
2

त्रुटि संदेश और वर्णन से आंकना मुझे लगता है कि पंक्ति [भाजक] एक बॉक्स्ड डबल, प्रकार वस्तु की तो है। अनबॉक्सिंग केवल सही अंतर्निहित डेटाटाइप पर ही किया जा सकता है, क्योंकि रनटाइम अब वास्तविक रूपांतरण ऑपरेटर को डबल से दशमलव तक नहीं ढूंढता है (आपके मामले में यह ऑपरेटर ढूंढने का प्रयास करता है जो ऑब्जेक्ट को दशमलव में परिवर्तित करता है, लेकिन वह एक है unboxing ऑपरेटर और अंतर्निहित प्रकार दशमलव में नहीं है तो सही तरीके से पहले दोगुना करने के लिए और फिर दशमलव कन्वर्ट करने के लिए किया जाना चाहिए:।।

decimal d = (decimal)(double)row[denominator]; 
0

सिर्फ

decimal d = Convert.ToDecimal(row[denominator]); 
करना

इस तरह, आपको सभी कास्टिंग समस्याओं के बारे में चिंता करने की आवश्यकता नहीं है।

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