Cách đặt enum thành null


191

Tôi có một enum

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

Làm thế nào để thiết lập nó thành NULL khi tải.

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

Chỉnh sửa: xấu của tôi, tôi đã không giải thích nó đúng. Nhưng tất cả các câu trả lời liên quan đến nullable là hoàn hảo. Tình huống của tôi là Điều gì xảy ra nếu, tôi có get / set cho enum trong một lớp với các thành phần khác như tên, v.v. Khi tải trang, tôi khởi tạo lớp và cố gắng mặc định các giá trị thành null. Đây là kịch bản (Mã nằm trong 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; //???
        }
    }

}

Sau đó, sử dụng các gợi ý bên dưới, tôi đã thay đổi mã ở trên để làm cho nó hoạt động với các phương thức get và set. Tôi chỉ cần thêm "?" trong lớp EnumTest trong khi khai báo biến enum riêng và trong phương thức 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; }
    }

}

Cảm ơn tất cả những lời đề nghị đáng yêu.


Câu trả lời:


370

Bạn có thể sử dụng dấu "?" toán tử cho một loại nullable.

public Color? myColor = null;

Hoặc sử dụng thực tiễn tiêu chuẩn cho các enum không thể rỗng bằng cách có giá trị FIRST trong enum (aka 0) là giá trị mặc định. Ví dụ trong trường hợp màu Không có.

public Color myColor = Color.None;

@equiman không cần truyền vì loại được chỉ định ở bên trái, về cơ bản bạn đang sao chép phần đầu tiên của câu trả lời của tôi đã được chấp nhận.
Rodney S. Foley

7
Điều này đã trả lời câu hỏi của tôi: Bạn có thể thêm '?' để cựu sinh viên làm cho nó vô giá trị?
LuckyLikey

đối với những người đã có loại nullable được khai báo trong lớp của họ và đến đây: myColor = (Color?) null;
StefanJanssen

@StefanJanssen bạn không cần bỏ null nếu nó đã là loại Màu không thể khai báo, chỉ myColor = null là ổn.
Rodney S. Foley

Tôi không biết vấn đề là gì sau đó, nhưng đối với trình biên dịch của tôi, nó đã bị lỗi cho đến khi tôi thực hiện.
StefanJanssen

43

Nếu đây là C #, nó sẽ không hoạt động: enums là loại giá trị và không thể null.

Các tùy chọn bình thường là thêm một Nonethành viên:

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

Color color = Color.None;

... hoặc sử dụng Nullable:

Color? color = null;

24

Làm cho biến của bạn là nullable. Giống:

Color? color = null;

hoặc là

Nullable<Color> color = null;

9

Enum là loại "giá trị" trong C # (có nghĩa là enum được lưu trữ dưới dạng giá trị bất kỳ, không phải là tham chiếu đến một vị trí trong bộ nhớ nơi lưu trữ giá trị đó). Bạn không thể đặt loại giá trị thành null (vì null chỉ được sử dụng cho loại tham chiếu).

Điều đó đang được nói rằng bạn có thể sử dụng lớp dựng sẵn Nullable<T>bao bọc các loại giá trị để bạn có thể đặt chúng thành null, kiểm tra xem nó HasValuevà có thực tế không Value. (Đó là cả hai phương thức trên các Nullable<T>đối tượng.

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

Ngoài ra còn có một phím tắt bạn có thể sử dụng:

Color? color = null;

Điều đó cũng giống như Nullable<Color>;


3

Tôi đang giả sử c ++ ở đây. Nếu bạn đang sử dụng c #, câu trả lời có thể giống nhau, nhưng cú pháp sẽ hơi khác một chút. Enum là một tập hợp các giá trị int. Nó không phải là một đối tượng, vì vậy bạn không nên đặt nó thành null. Đặt một cái gì đó thành null có nghĩa là bạn đang trỏ một con trỏ tới một đối tượng để giải quyết số không. Bạn thực sự không thể làm điều đó với một int. Những gì bạn muốn làm với một int là đặt nó thành một giá trị mà bạn thường không có nó để bạn có thể tel nếu đó là một giá trị tốt hay không. Vì vậy, hãy đặt màu của bạn thành -1

Color color = -1;

Hoặc, bạn có thể bắt đầu enum của mình ở mức 1 và đặt nó về 0. Nếu bạn đặt màu thành 0 như hiện tại, bạn sẽ đặt nó thành "đỏ" vì màu đỏ là 0 trong enum của bạn.

Vì thế,

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

0

sẽ không tốt hơn nếu gán rõ ràng giá trị 0 cho None hằng số? Tại sao?

Bởi vì enumgiá trị mặc định bằng 0, nếu bạn gọi default(Color)nó sẽ in None.

Vì ở vị trí đầu tiên, việc gán giá trị bằng 0 cho bất kỳ hằng số nào khác sẽ thay đổi hành vi đó, việc thay đổi thứ tự xuất hiện sẽ thay đổi đầu ra của default(Color)( https://stackoverflow.com/a/4967673/8611327 )


-2
Color? color = null;

hoặc bạn có thể sử dụng

Color? color = new Color?();

ví dụ khi gán null sẽ không hoạt động

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

để bạn có thể sử dụng:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.