2009-03-06 4 views
11

निम्न कोड अपवाद नहीं उत्पन्न करता है बल्कि इसके बजाय मान 4 को tst पास करता है। क्या कोई इसके पीछे कारण बता सकता है?सी # में एक एनम में आउट-ऑफ-रेंज नंबर कास्टिंग अपवाद नहीं बनाता

public enum testing 
{ 
    a = 1, 
    b = 2, 
    c = 3 
} 

testing tst = (testing)(4); 

उत्तर

20

सी # में, जावा के विपरीत, enums की जांच नहीं की जाती है। आपके पास अंतर्निहित प्रकार का कोई मूल्य हो सकता है। यही कारण है कि अपने इनपुट की जांच करना बहुत महत्वपूर्ण है।

if(!Enum.IsDefined(typeof(MyEnum), value)) 
    throw new ArgumentOutOfRangeException(); 
+1

सी # की कुछ विशेषताएं हैं जिन्हें मैं जावा डेवलपर (LINQ!) के रूप में लंबे समय तक लेता हूं, लेकिन जावा यहां वास्तव में सही है ... –

+0

@saua: जरूरी नहीं। वे इस दृष्टिकोण के साथ-साथ नुकसान के फायदे हैं। –

+0

इस बिंदु का मुख्य लाभ यह है कि आप मूल्यों को जोड़ सकते हैं, जिन्हें आपको [ध्वज] विशेषता के साथ भी चिह्नित करना चाहिए। –

1

चूंकि आपका enum int पर आधारित है, यह किसी भी मूल्य को स्वीकार कर सकता है। और चूंकि आप संकलक को स्पष्ट रूप से (कास्टिंग करके) बता रहे हैं कि यह आपके enum में 4 डालना ठीक है, ऐसा करता है।

1

प्रत्येक enum में अंतर्निहित संख्यात्मक प्रकार (उदा। Int) है जिसका प्रतिनिधित्व प्रतिनिधित्व के लिए किया जाता है। यहां तक ​​कि यदि किसी मान का नाम नहीं है, तो यह संभव है कि enum हो सकता है।

1

अन्य ने क्या नहीं कहा: कास्टिंग के साथ, आप संकलक को बताते हैं कि आप जानते हैं कि आप क्या कर रहे हैं। तो यदि आप इसे बताते हैं, तो इसे एक enum मान के रूप में देखें, यह करता है। अन्य पोस्टर्स ने बताया कि यह अभी भी क्यों अनुमति है, क्योंकि सी # कंपाइलर कई बुरी चीजों की अनुमति नहीं देता है, भले ही आप कहते हैं कि आप जानते हैं कि आप क्या कर रहे हैं।

यदि मूल्य की अनुमति नहीं थी तो यह वास्तव में खराब होगा, क्योंकि तब आप एक ध्वज मूल्य को int के रूप में सहेज नहीं सकते थे। या, किसी को यह जांचना पड़ता था कि int अनुमत संयोजनों में से एक है, जो कि अगर आप फ्लैग एनम का उपयोग करते हैं तो बहुत कुछ हो सकता है (मानों के साथ जो एक साथ हो सकते हैं)।

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