एक "डिफ़ॉल्ट" के सदस्य की abscence में, मुझे लगता है कि यह वाला मान के लिए मूल्यवान है शाब्दिक पूर्णांक 0.
कोई फर्क नहीं पड़ता, किसी दिए गए enum वस्तुतः मान 0. के साथ बनाया जाएगा सबसे सीधे आगे का मामला एक संरचना के सदस्य के रूप में है। एक सी # संरचना में हमेशा एक खाली डिफ़ॉल्ट कन्स्ट्रक्टर होगा जो सभी फ़ील्ड को उनके डिफ़ॉल्ट मान में निष्क्रिय करता है। एक enum के मामले में, यह शाब्दिक मूल्य होगा 0. सवाल यह है कि इसे कैसे संभालना है।
मेरे लिए यह शैली का एक मुद्दा है: यदि enum स्पष्ट रूप से किसी मान के लिए प्रारंभ नहीं किया गया है, तो इसे एक मनमाना वैध मान या स्पष्ट प्रारंभिक कमी की कमी का संकेत देने वाला विशिष्ट मान दिया जाना चाहिए?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
v1 के मामले में, यदि रंग क्षेत्र का निरीक्षण किया जाता है तो इसे स्पष्ट रूप से एक प्रारंभिक क्षेत्र के रूप में लेबल किया जाएगा। V2 में फ़ील्ड सरल "लाल" होगा। प्रोग्रामर के लिए "रेड" या "लाल" के लिए एक निहित डिफ़ॉल्ट मान के बीच पहचानने और स्पष्ट रूप से सेट करने का कोई तरीका नहीं है।
एक और मामला जहां यह समस्या का कारण बनता है, एक एनम मूल्य के खिलाफ स्विच स्टेटमेंट कर रहा है। आइए रंग 2 की परिभाषा को धीरे-धीरे बदल दें।
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch (p1.color) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
स्विच एनम में हर स्पष्ट मूल्य को संभालता है। फिर भी यह कोड उदाहरण < रंग 2 > के डिफ़ॉल्ट निर्माता के लिए विफल हो जाएगा और इस कन्स्ट्रक्टर को दबाए रखने का कोई तरीका नहीं है।
इस लाता है एक slighly अधिक महत्वपूर्ण नियम: वस्तुतः मान 0.
सहमत हैं, सबसे साफ समाधान एक शून्य प्रकार है। यह अच्छी तरह से डीबी स्कीमा के लिए भी नक्शे। –
यह दुर्भाग्यपूर्ण है कि .NET में enums आपको मान्य मान में पास करने के लिए मजबूर नहीं करता है। मैं (रंग) 123123 में पास कर सकता हूं जो संकलित और ठीक से चलाएगा - ड्रा विधि को सत्यापन करना होगा :( –
शायद सी से विरासत, जहां संकलक को पता नहीं है कि एक enum का उपयोग एक वास्तविक गणना के रूप में किया जाता है या नहीं टाइप करें, या झंडे के सेट के रूप में। तो यह हवा और सरेंडर में अपने हाथ फेंकता है। –