एनम को अशक्त करने के लिए कैसे सेट करें


192

मेरे पास एक एनम है

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

इसे लोड पर NULL में कैसे सेट करें।

name = "";
Color color = null; //error

संपादित: मेरा बुरा, मैंने इसे ठीक से नहीं समझाया। लेकिन अशक्त से संबंधित सभी उत्तर एकदम सही हैं। मेरी स्थिति क्या है अगर, मुझे कक्षा में नाम के लिए अन्य तत्वों जैसे नाम आदि के लिए मिला / सेट किया गया है, तो पृष्ठ लोड पर मैं कक्षा को आरंभ करता हूं और मानों को शून्य करने का प्रयास करता हूं। यहाँ परिदृश्य है (कोड # C में है):

namespace Testing
{
    public enum ValidColors
    {
        Red,
        Green,
        Yellow
    }

    public class EnumTest
    {
        private string name;
        private ValidColors myColor;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public ValidColors MyColor
        {
            get { return myColor; }
            set { myColor = value; }
        }

    }

    public partial class _Default : System.Web.UI.Page
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            EnumTest oEnumTest = new EnumTest();
            oEnumTest.Name = "";
            oEnumTest.MyColor = null; //???
        }
    }

}

फिर नीचे दिए गए सुझावों का उपयोग करते हुए मैंने उपरोक्त कोड को बदलकर इसे प्राप्त करने और सेट करने के तरीकों के साथ काम किया। मुझे बस "जोड़ने की जरूरत है?" EnumTest वर्ग में निजी एनम चर की घोषणा के दौरान और पाने में / सेट विधि:

public class EnumTest
{
    private string name;
    private ValidColors? myColor; //added "?" here in declaration and in get/set method

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public ValidColors? MyColor
    {
        get { return myColor; }
        set { myColor = value; }
    }

}

प्यारे सुझावों के लिए धन्यवाद।


जवाबों:


371

आप या तो "का उपयोग कर सकते हैं?" एक अशक्त प्रकार के लिए ऑपरेटर।

public Color? myColor = null;

या एनम के लिए मानक अभ्यास का उपयोग करें जो कि एनम में एफ़एसटी मूल्य होने से शून्य नहीं हो सकता (उर्फ 0) डिफ़ॉल्ट मान हो। उदाहरण के लिए रंग के मामले में कोई नहीं।

public Color myColor = Color.None;

@equiman को छोड़ने की आवश्यकता नहीं है क्योंकि टाइप बाईं ओर निर्दिष्ट है, आप मूल रूप से मेरे उत्तर के पहले भाग को दोहरा रहे हैं जो पहले से ही स्वीकृत है।
रोडनी एस। फोली

7
इसने मेरे सवाल का जवाब दिया: क्या आप जोड़ सकते हैं? ' enumname इसे nullable बनाने के लिए?
लकीलकी

उन लोगों के लिए जो पहले से ही अपनी श्रेणी में अशक्त प्रकार घोषित कर चुके हैं और यहाँ आते हैं: myColor = (Color?) null;
स्टीफनजैनसेन

@StefanJanssen आपको नल डालने की ज़रूरत नहीं है अगर इसका पहले से घोषित घोषित प्रकार का रंग सिर्फ myColor = null ठीक है।
रॉडने एस। फोली

मुझे नहीं पता कि यह मुद्दा क्या है, लेकिन मेरे कंपाइलर के लिए यह गलतियां थी जब तक मैंने कास्ट नहीं किया।
स्टेफानजैनसेन

43

यदि यह C # है, तो यह काम नहीं करेगा: enums मान प्रकार हैं, और नहीं हो सकता null

Noneसदस्य जोड़ने के लिए सामान्य विकल्प हैं :

public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

... या उपयोग करने के लिए Nullable:

Color? color = null;

24

अपने चर को अशक्त बनाओ। पसंद:

Color? color = null;

या

Nullable<Color> color = null;

9

एक एनम C # में एक "मान" प्रकार है (इसका अर्थ है कि एनम संग्रहित किया जाता है जो कुछ भी मान है, स्मृति में एक जगह के संदर्भ के रूप में नहीं जहां मूल्य स्वयं संग्रहीत है)। आप मान प्रकार को शून्य पर सेट नहीं कर सकते (क्योंकि नल का उपयोग केवल संदर्भ प्रकारों के लिए किया जाता है)।

यह कहा जा रहा है कि आप Nullable<T>वर्ग में निर्मित का उपयोग कर सकते हैं जो मूल्य प्रकारों को लपेटता है जैसे कि आप उन्हें अशक्त करने के लिए सेट कर सकते हैं, जांचें कि क्या यह HasValueवास्तविक है और इसे प्राप्त करें Value। (वे दोनों Nullable<T>वस्तुएं हैं।

name = "";
Nullable<Color> color = null; //This will work.

एक शॉर्टकट भी है जिसका आप उपयोग कर सकते हैं:

Color? color = null;

वह जैसा है Nullable<Color>;


3

मैं यहाँ c ++ मान रहा हूँ। यदि आप c # का उपयोग कर रहे हैं, तो उत्तर शायद एक ही है, लेकिन वाक्यविन्यास थोड़ा अलग होगा। एनम अंतर मूल्यों का एक समूह है। यह एक वस्तु नहीं है, इसलिए आपको इसे शून्य करने के लिए नहीं होना चाहिए। शून्य करने के लिए कुछ सेट करने का मतलब है कि आप शून्य को संबोधित करने के लिए किसी ऑब्जेक्ट की ओर इशारा कर रहे हैं। आप वास्तव में एक इंट के साथ ऐसा नहीं कर सकते। आप एक इंट के साथ क्या करना चाहते हैं यह एक मूल्य पर सेट करना है जो आपके पास सामान्य रूप से नहीं होगा ताकि आप यह मान सकें कि यह एक अच्छा मूल्य है या नहीं। इसलिए, अपना रंग -1 पर सेट करें

Color color = -1;

या, आप 1 पर अपनी एनम शुरू कर सकते हैं और इसे शून्य पर सेट कर सकते हैं। यदि आप रंग को शून्य पर सेट करते हैं जैसा कि अभी है, तो आप इसे "लाल" पर सेट कर देंगे क्योंकि लाल आपके एनम में शून्य है।

इसलिए,

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;

0

क्या मूल्य 0 को None स्थिर रूप से निर्दिष्ट करना बेहतर नहीं होगा ? क्यों?

क्योंकि डिफ़ॉल्ट enumमान 0 के बराबर है, यदि आप कहते हैं default(Color)कि यह प्रिंट होगा None

क्योंकि यह पहली स्थिति में है, किसी अन्य स्थिरांक को शाब्दिक मान 0 प्रदान करने से वह व्यवहार बदल जाएगा, साथ ही घटना के क्रम में बदलाव भी होगा default(Color)( https://stackoverflow.com/a/4967673/8611327 )


-2
Color? color = null;

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

Color? color = new Color?();

उदाहरण जहां अशक्त अभ्यस्त काम असाइन करना

color = x == 5 ? Color.Red : x == 9 ? Color.Black : null ; 

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

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.