Cara mengatur enum ke null

194

Saya punya enum

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Cara mengaturnya menjadi NULL saat memuat.

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

Diedit: Buruk saya, saya tidak menjelaskannya dengan benar. Tetapi semua jawaban yang terkait dengan nullable sempurna. Situasi saya adalah Bagaimana jika, saya telah mendapatkan / mengatur enum di kelas dengan elemen lain seperti nama, dll. Pada pemuatan halaman saya menginisialisasi kelas dan mencoba untuk menetapkan nilai default ke nol. Berikut ini skenario (Kode dalam 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; //???
        }
    }

}

Kemudian menggunakan saran di bawah ini saya mengubah kode di atas untuk membuatnya bekerja dengan metode get dan set. Saya hanya perlu menambahkan "?" di kelas EnumTest selama deklarasi variabel enum pribadi dan dalam metode get / set:

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

}

Terima kasih atas saran yang bagus.

Sri Reddy
sumber
Kemungkinan duplikat dari C # Enums: Nilai Nullable atau 'Unknown'?
Michael Freidgeim

Jawaban:

374

Anda bisa menggunakan "?" operator untuk jenis nullable.

public Color? myColor = null;

Atau gunakan praktik standar untuk enum yang tidak bisa nol dengan memiliki nilai PERTAMA dalam enum (alias 0) menjadi nilai default. Misalnya dalam kasus warna Tidak Ada.

public Color myColor = Color.None;
Rodney S. Foley
sumber
@equiman tidak perlu melakukan casting karena jenisnya ditentukan di sebelah kiri, Anda pada dasarnya menduplikasi bagian pertama dari jawaban saya yang sudah diterima.
Rodney S. Foley
7
ini menjawab pertanyaan saya: Bisakah Anda menambahkan '?' untuk enumname untuk membuatnya nullable?
LuckyLikey
bagi mereka yang sudah memiliki tipe nullable yang dideklarasikan di kelas mereka dan datang ke sini: myColor = (Color?) null;
StefanJanssen
@StefanJanssen Anda tidak perlu memberikan null jika sudah dinyatakan sebagai jenis warna nullable hanya myColor = null baik-baik saja.
Rodney S. Foley
Saya tidak tahu apa masalahnya, tetapi untuk kompiler saya itu memang memberikan kesalahan sampai saya melakukan pemerannya.
StefanJanssen
43

Jika ini adalah C #, itu tidak akan berfungsi: enums adalah tipe nilai, dan tidak bisa null.

Opsi normal adalah menambahkan Noneanggota:

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

Color color = Color.None;

... atau menggunakan Nullable:

Color? color = null;
Tim Robinson
sumber
24

Buat variabel Anda nullable. Suka:

Color? color = null;

atau

Nullable<Color> color = null;
Cj S.
sumber
9

Enum adalah tipe "nilai" dalam C # (berarti enum disimpan sebagai nilai apa pun itu, bukan sebagai referensi ke tempat di memori tempat nilai itu sendiri disimpan). Anda tidak dapat menetapkan tipe nilai ke nol (karena nol hanya digunakan untuk tipe referensi).

Yang sedang berkata bahwa Anda dapat menggunakan kelas built in Nullable<T>yang membungkus tipe nilai sedemikian rupa sehingga Anda dapat mengaturnya menjadi nol, periksa apakah itu HasValuedan dapatkan yang sebenarnya Value. (Keduanya adalah metode pada Nullable<T>objek.

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

Ada juga jalan pintas yang bisa Anda gunakan:

Color? color = null;

Itu sama dengan Nullable<Color>;

Chris Pfohl
sumber
3

Saya mengasumsikan c ++ di sini. Jika Anda menggunakan c #, jawabannya mungkin sama, tetapi sintaksinya akan sedikit berbeda. Enum adalah seperangkat nilai int. Ini bukan objek, jadi Anda seharusnya tidak menyetelnya menjadi nol. Mengatur sesuatu ke nol berarti Anda mengarahkan pointer ke objek untuk mengatasi nol. Anda tidak dapat melakukannya dengan int. Apa yang ingin Anda lakukan dengan int adalah menetapkannya ke nilai yang biasanya tidak Anda miliki sehingga Anda dapat menelpon apakah itu nilai yang baik atau tidak. Jadi, atur warna Anda ke -1

Color color = -1;

Atau, Anda dapat memulai enum Anda pada 1 dan mengaturnya ke nol. Jika Anda mengatur warna ke nol seperti sekarang, Anda akan mengaturnya ke "merah" karena merah adalah nol di enum Anda.

Begitu,

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

tidakkah lebih baik untuk secara eksplisit menetapkan nilai 0 ke None konstan? Mengapa?

Karena enumnilai default sama dengan 0, jika Anda akan menyebutnya default(Color)akan mencetak None.

Karena berada di posisi pertama, menetapkan nilai literal 0 ke konstanta lain akan mengubah perilaku itu, juga mengubah urutan kejadian akan mengubah output dari default(Color)( https://stackoverflow.com/a/4967673/8611327 )

sjanisz
sumber
-2
Color? color = null;

atau bisa kamu gunakan

Color? color = new Color?();

contoh di mana menugaskan null tidak akan bekerja

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

jadi kamu bisa menggunakan:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
TLEJMI
sumber