Enum null olarak nasıl ayarlanır


194

Bir numaram var

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Yükte NULL olarak nasıl ayarlanır.

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

Düzenlendi: Benim kötüm, düzgün açıklamamıştım. Ama nullable ile ilgili tüm cevaplar mükemmel. Benim durumum Ne ise, ben adı / vb gibi diğer unsurları ile bir sınıfta numaralandırma için set / set varsa. Sayfa yük üzerinde ben sınıf başlatmak ve değerleri null varsayılan olarak deneyin. İşte senaryo (Kod C # 'dadır):

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; //???
        }
    }

}

Sonra aşağıdaki önerileri kullanarak get ve set yöntemleri ile çalışması için yukarıdaki kodu değiştirdim. Sadece "?" Özel numara değişkeni bildirimi sırasında EnumTest sınıfında ve get / set yönteminde:

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; }
    }

}

Tüm güzel öneriler için teşekkürler.


Yanıtlar:


374

"?" sıfırlanabilir tür için işleç.

public Color? myColor = null;

Veya numaralandırmadaki İLK değerinin (aka 0) varsayılan değer olması nedeniyle boş bırakılamayan numaralandırmalar için standart uygulamayı kullanın. Örneğin renk durumunda Yok.

public Color myColor = Color.None;

@equiman, solda belirtildiği için yayınlamaya gerek yok, temelde cevabımın zaten kabul edilen ilk kısmını çoğaltıyorsunuz.
Rodney S. Foley

7
bu sorumu yanıtladı: '?' numname yapmak nulllable yapmak için?
LuckyLikey

sınıflarında zaten belirtilmiş olan nullable tipine sahip olan ve buraya gelenler için: myColor = (Color?) null;
StefanJanssen

@StefanJanssen, zaten bildirilmiş bir nulllable Renk türü olarak yalnızca nColor = null iyi ise, null değerini almanıza gerek yoktur.
Rodney S. Foley

O zaman sorunun ne olduğunu bilmiyorum, ama benim derleyici için oyuncular yapana kadar hata verdi.
StefanJanssen

43

Bu C # ise işe yaramaz: numaralandırmalar değer türleridir ve olamaz null.

Normal seçenekler Noneüye eklemektir :

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

Color color = Color.None;

... veya kullanmak için Nullable:

Color? color = null;

24

Değişkeninizi sıfırlanabilir yapın. Sevmek:

Color? color = null;

veya

Nullable<Color> color = null;

9

Bir numaralandırma, C # içindeki bir "değer" türüdür (enum, değerin kendisinin saklandığı bellekteki bir yere başvuru olarak değil, değeri ne olursa olsun depolandığı anlamına gelir). Değer türlerini null olarak ayarlayamazsınız (null yalnızca başvuru türleri için kullanıldığından).

Nullable<T>Değer türlerini saran yerleşik sınıfı kullanabileceğiniz söylenir, böylece onları null olarak ayarlayabilir, kontrol edip HasValuegerçek değerini alabilirsiniz Value. (Her ikisi de Nullable<T>nesneler üzerindeki yöntemlerdir .

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

Ayrıca kullanabileceğiniz bir kısayol var:

Color? color = null;

Bu aynı Nullable<Color>;


3

Burada c ++ varsayıyorum. C # kullanıyorsanız, cevap muhtemelen aynıdır, ancak sözdizimi biraz farklı olacaktır. Enum bir int değerleri kümesidir. Bu bir nesne değil, bu yüzden null değerine ayarlamamalısınız. Bir şeyi null olarak ayarlamak, sıfırı adreslemek için bir nesneye bir işaretçi işaret ettiğiniz anlamına gelir. Bunu gerçekten bir int ile yapamazsınız. Bir int ile yapmak istediğiniz şey, onu normalde sahip olmadığınız bir değere ayarlamaktır, böylece iyi bir değer olup olmadığını tel yapabilirsiniz. Bu nedenle, renginizi -1 olarak ayarlayın

Color color = -1;

Veya, numaralandırma 1 başlatabilir ve sıfıra ayarlayabilirsiniz. Rengi şu anda olduğu gibi sıfıra ayarlarsanız, numaralamanızda kırmızı sıfır olduğu için rengi "kırmızı" olarak ayarlarsınız.

Yani,

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

0

0 değerini açıkça None sabit olarak atamak daha iyi olmaz mıydı ? Neden?

Varsayılan enumdeğer 0'a eşit olduğundan, çağırırsanız default(Color)yazdırır None.

İlk konumda olduğundan, değişmez değeri 0'ı başka bir sabite atamak bu davranışı değiştirir, ayrıca meydana gelme sırasını değiştirmek de default(Color)( https://stackoverflow.com/a/4967673/8611327 ) çıktısını değiştirir.


-2
Color? color = null;

ya da kullanabilirsiniz

Color? color = new Color?();

null alışkanlığının işe yaramayacağı örnek

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

böylece kullanabilirsiniz:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.