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 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).
'\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.
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?
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.
Foosau Barcả hai Foovà Barsẽ 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 :(