Giá trị mặc định cho biến enum là gì?


240

Một biến enum, có ai biết nếu nó luôn được mặc định là phần tử đầu tiên không?


1
Một xem xét cho trường hợp sử dụng trong đó một enum mặc định là mong muốn sử dụng một biến nullable. Khi nhận được null, nó có thể được dịch trong phần chính xác của mã thành mặc định và mặc định này không phải được biết trong phần còn lại của mã (chỉ đi qua một null).
ErikE

Câu trả lời:


381

Nó là bất cứ thành viên nào của bảng liệt kê đại diện cho giá trị 0. Cụ thể, từ tài liệu :

Giá trị mặc định của an enum Elà giá trị được tạo bởi biểu thức (E)0.

Ví dụ, lấy enum sau:

enum E
{
    Foo, Bar, Baz, Quux
}

Không ghi đè các giá trị mặc định, in default(E)trả về Foovì đây là phần tử xuất hiện đầu tiên.

Tuy nhiên, đó là không phải lúc nào các trường hợp đó 0của một enum được đại diện bởi các thành viên đầu tiên. Ví dụ: nếu bạn làm điều này:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

In ấn default(F)sẽ cung cấp cho bạn Quux, không Foo.

Nếu không có phần tử nào trong enum Gtương ứng với 0:

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)trả về theo nghĩa đen 0, mặc dù kiểu của nó vẫn như G(như được trích dẫn bởi các tài liệu ở trên, một kiểu đúc cho kiểu enum đã cho).


1
Cảm ơn, và những gì về enums được xác định với char thay vì int. ví dụ: enum Status {Active = 'A', Inactive = 'I'}
Fernando Torres

3
@Fernando Torres: Vẫn là 0, trừ khi một trong các giá trị enum của bạn tương ứng với '\0'hoặc default(char), rất khó xảy ra vì default(char)ký tự NUL tương ứng với mã char 0.
BoltClock

Tôi (không chính xác?) Giả sử rằng sử dụng DefaultValuethuộc tính - đại loại như - có System.ComponentModel.DefaultValue(MyEnum.Blah)thể sửa đổi hành vi của default(MyEnum)nhưng nó vẫn mang lại 0. Có cách nào để tạo ra một sự trừu tượng cho enumgiá trị mặc định của nó không?
Craig Silver

2
@Craig Silver: Thuộc tính DefaultValue áp dụng cho các thuộc tính - enum là một loại và như vậy, DefaultValue không có tác dụng đối với toàn bộ loại enum. Tôi cho rằng bạn có thể giải quyết vấn đề này bằng một phương pháp mở rộng, nhưng tốt hơn hết là bạn chỉ nên kiểm tra 0.
BoltClock

11

Tôi nghĩ sẽ khá nguy hiểm khi dựa vào thứ tự của các giá trị trong một enum và cho rằng đầu tiên luôn là mặc định. Đây sẽ là thực hành tốt nếu bạn quan tâm đến việc bảo vệ giá trị mặc định.

enum E
{
    Foo = 0, Bar, Baz, Quux
}

Mặt khác, tất cả chỉ là một công cụ tái cấu trúc bất cẩn của đơn đặt hàng và bạn đã có một mặc định hoàn toàn khác.


3
Xin lỗi bạn sai. Tôi đã giả sử như nhau nhưng nếu bạn đặt Foosau Barcả hai FooBarsẽ có giá trị 0 và E.Foo == E.Barsẽ trả về true. Điều đó thật ngu ngốc và phản trực giác nhưng đó là sự thật :(
Pawcio
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.