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?
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?
Câu trả lời:
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 E
là 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ề Foo
vì đâ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 đó 0
củ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 G
tươ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).
'\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.
DefaultValue
thuộ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 enum
giá trị mặc định của nó không?
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.
Foo
sau Bar
cả hai Foo
và Bar
sẽ có giá trị 0 và E.Foo == E.Bar
sẽ trả về true
. Điều đó thật ngu ngốc và phản trực giác nhưng đó là sự thật :(