2016-02-04 36 views
5

cho tôi có một enum với giá trị tùy chỉnh cho chỉ là một phần của danh sáchEnum với các giá trị quy định chỉ một số các thành viên

public enum MyEnum 
{ 
    FirstValue, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

Khi tôi cố gắng strina name = (MyEnum)2; tên là ThirdValue.

Nhưng khi tôi thay đổi enum để

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

Trong strina name = (MyEnum)2; tên là FifthValue.

Trình biên dịch (Tôi đang sử dụng Visual Studio 2012) chỉ khởi tạo giá trị tùy chỉnh nếu giá trị tùy chỉnh đầu tiên có?

Và nếu ThirdValue có giá trị mặc định 2 trong ví dụ đầu tiên thì không có lỗi nào trong số FifthValue = 2?

+4

Các giá trị trong ví dụ ban đầu sẽ là 0, 1, 2, 1, 2. Cả hai 'ThirdValue 'và' FifthValue' tương ứng với giá trị số nguyên 2, như vậy, trình gỡ rối chỉ chọn một trong các giá trị cho bạn. –

Trả lời

6

Khi bạn gán giá trị cho một thành viên enum, trình biên dịch tăng giá trị bởi một cho thành viên tiếp theo, trừ khi nó được định nghĩa. Nếu có thành viên nào có giá trị, việc đánh số bắt đầu từ 0.

ví dụ đầu tiên của bạn, với những gì trình biên dịch được thực hiện là:

public enum MyEnum 
{ 
    FirstValue, // == 0 
    SecondValue, // == 1 
    ThirdValue, // == 2 
    ForthValue = 1, 
    FifthValue = 2 
} 

vì vậy bạn phải hai thành viên có giá trị 2.

Hoặc cung cấp cho họ tất cả các giá trị hoặc không cung cấp giá trị. Bất cứ điều gì khác có thể sẽ dẫn đến sự nhầm lẫn.

CáC# tiêu chuẩn C, section 14.3 nói (tôi nhấn mạnh):

Giá trị liên quan đến một thành viên enum được gán hoặc ngầm hoặc một cách rõ ràng. Nếu khai báo thành viên enum có bộ khởi tạo biểu thức không đổi, giá trị của biểu thức hằng số đó, được chuyển đổi hoàn toàn thành kiểu cơ bản của enum, là giá trị liên quan của thành viên enum. Nếu việc kê khai của các thành viên enum không có người khởi tạo, giá trị liên quan của nó được thiết lập ngầm, như sau:

  • Nếu thành viên enum là thành viên enum đầu tiên tuyên bố trong các loại enum, giá trị liên quan đến nó là số không.
  • Nếu không, giá trị liên quan của thành viên enum thu được bằng cách tăng giá trị liên quan của thành viên enum trước văn bản theo. Giá trị gia tăng này phải nằm trong phạm vi giá trị có thể được thể hiện bằng loại cơ bản; nếu không, một lỗi biên dịch sẽ xảy ra.
+0

Huh. Đã suy nghĩ về điều này và tự hỏi điều gì sẽ xảy ra nếu bạn theo một mục có giá trị tối đa (theo mặc định, loại cơ bản cho giá trị enum là int) bởi một mục không có số được chỉ định - bạn sẽ nhận được [CS0543] (https://msdn.microsoft.com/en-us/library/b531f703.aspx): "* giá trị điều tra quá lớn để vừa với loại *". –

2

Giá trị số nguyên tương ứng mà giá trị enum ánh xạ luôn bắt đầu bằng 0 trừ khi bạn thay đổi cụ thể giá trị.

Như vậy, phần đầu tiên của bạn mã tương đương với điều này:

public enum MyEnum 
{ 
    FirstValue = 0, 
    SecondValue = 1, 
    ThirdValue = 2, 
    ForthValue = 1, 
    FifthValue = 2 
} 

Vì vậy, bạn có thể thấy rằng 2 bản đồ cho cả hai ThirdValueFifthValue.

ví dụ thứ hai của bạn là tương đương với điều này:

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue = 4, 
    ThirdValue = 5, 
    ForthValue = 1, 
    FifthValue = 2 
} 
0

Nhiều điều tra viên có thể có cùng giá trị. Nếu bạn không muốn chỉ định giá trị cho mỗi điều tra viên, chỉ cần chuyển đổi thứ tự bạn xác định các điều tra viên:

public enum MyEnum 
{ 
    FourthValue = 1, 
    FifthValue, 
    FirstValue, 
    SecondValue, 
    ThirdValue 
} 
Các vấn đề liên quan