2015-05-22 6 views
5

के साथ मान्य नहीं है मेरे पास यह फ़ंक्शन है जो वर्तमान मान की जांच करता है। जब वर्तमान मूल्य (1 पैरामीटर) शून्य या खाली है, तो यह आप पारित डिफ़ॉल्ट मान (2 पैरामीटर)निर्दिष्ट कास्ट जेनेरिक

public static T ZeroNull<T>(object currentValue, T defaultValue) 
{ 
    if (currentValue.Equals(DBNull.Value)) 
     return (T)defaultValue; 
    else if (currentValue.Equals(string.Empty)) 
     return (T)defaultValue; 
    else 
     return (T)currentValue; 
} 

का उपयोग करता कोड ऊपर ठीक से काम कर रहा है, आंशिक रूप से ... लेकिन जब मैं की तरह कोड का उपयोग यही नहीं, यह फेंकता एक "निर्दिष्ट डाली मान्य नहीं है ..."

float currValue = 20.1f; 
int i = ZeroNull<int>(currValue, 0); // Specified cast is not valid 

int i = ZeroNull<int>("10", 0); // Specified cast is not valid 

किसी उपरोक्त कोड स्निप सुधार कर सकते हैं? और क्यों संकलक इस त्रुटि फेंक?

सादर, जेसी

+0

समस्या यह है कि 'currValue' एक बॉक्स्ड नाव (20.1f) है और अपने एक पूर्णांक जो मान्य नहीं है करने के लिए Unbox करने की कोशिश कर रहा है। यह "10" – chomba

+0

धन्यवाद चोंबा के लिए जाता है, लेकिन जब मैं ऐसा करता हूं तो यह त्रुटि क्यों नहीं फेंक रहा है। 'कोड'float currValue = 10.2f; 'कोड'int newCurrValue = (int) currValue; मुझे लगता है कि उनके पास एक ही तर्क है? – klaydze

+0

ऐसा इसलिए है क्योंकि आप स्पष्ट रूप से मूल्य प्रकारों के बीच कास्टिंग कर रहे हैं। हालांकि जब आप किसी मान प्रकार का बॉक्स बनाते हैं तो आपको पहले इसे अंतर्निहित प्रकार में अनबॉक्स करना होगा। – chomba

उत्तर

4

आप IConvertible इंटरफ़ेस का उपयोग कर प्रयास कर सकते हैं, इसलिए कम से कम इसे लागू करने वाले प्रकारों के लिए काम करेंगे। खबरदार, यह अभी भी प्रकार जो इसके बारे में उपयोग नहीं करते हैं के लिए अपवाद फेंक सकते हैं, लेकिन अपने रूपांतरणों के लिए यह ठीक कर रहा है:

public static T ZeroNull<T>(object currentValue, T defaultValue) 
{ 
    if (currentValue.Equals(DBNull.Value)) 
     return (T)defaultValue; 
    else if (currentValue.Equals(string.Empty)) 
     return (T)defaultValue; 
    else 
     return (T)Convert.ChangeType(currentValue,typeof(T)); 
} 

अपने कलाकारों के संबंध में नाव से int करने के लिए: यदि आप एक बॉक्स्ड प्रकार परिवर्तित करने के लिए कोशिश कर रहे हैं - जब आप अपनी विधि को बुलाते थे तो इसे बॉक्स किया गया था जो प्रभावी रूप से इसे किसी ऑब्जेक्ट में परिवर्तित कर देता था। बॉक्स किए गए प्रकार केवल खुद को वापस लाया जा सकता है। चूंकि int में एक कास्ट एक ही प्रकार का नहीं है, यह काम नहीं करेगा। पुन: पेश करने के लिए जेनरिक के बिना इस कोशिश है, यह भी एक InvalidCastException फेंक देगा:

float currValue = 20.1f; 

object yourValue = currValue; 
int i = (int) yourValue; //throws as well 
+0

आपके सुझाव के लिए धन्यवाद। मैंने कोशिश की है और मेरी वर्तमान आवश्यकता पर ठीक काम करता है। मैं आपके सुझाव पर तब तक रहूंगा जब तक कि मुझे फिर से एक और अपवाद नहीं मिलता। :) – klaydze

0

आपकी समस्या का निवारण कर रहे हैं कि आप के लिए int, जो आप currValue कास्टिंग टी करने के लिए जब टी प्रकार int की है द्वारा ऐसा करने के लिए कोशिश कर रहे हैं क्या स्ट्रिंग डाली नहीं कर सकता है।

ऐसा ऑपरेशन करने के लिए आपको Convert.ToInt32 या Int.Parse का उपयोग करना होगा। इनमें से कोई भी आपके वर्तमान डिजाइन को कमजोर कर देगा।

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