2011-07-19 44 views
40

Tôi đang chạy vào một hành vi mà tôi đã không mong đợi khi sử dụng Enum.TryParse.Enum.TryParse trả về true cho bất kỳ giá trị số

Nếu tôi có một enum:

public enum MyEnum 
{ 
    ValueA, 
    ValueB, 
    ValueC 
} 

Và sau đó tôi vượt qua một giá trị số (như là một chuỗi) vào Enum.TryParse, như:

MyEnum outputEnum; 
bool result = Enum.TryParse("1234", out outputEnum); 

Mặc dù chuỗi "1234" không là giá trị có thể, kết quả sẽ trở lại là true và outputEnum của tôi sẽ có giá trị là 1234.

Có cách nào để tránh hành vi này không? Tôi đang cố gắng để viết một chức năng mà sẽ xử lý đầu vào chuỗi tùy ý như một enum, và điều này đã ném một chút của một monkeywrench trong phát hiện đầu vào xấu của tôi.

+0

http://stackoverflow.com/questions/4728295/why-enums-require-an-explicit-cast-to-int-type –

Trả lời

60

Hành vi này là do thiết kế.

Các documentation nói:

. Nếu giá trị là biểu diễn chuỗi của một số nguyên không đại diện cho một giá trị cơ bản của liệt kê TEnum, phương thức trả về một thành viên liệt kê có giá trị cơ bản là giá trị được chuyển đổi thành một kiểu tích phân. Nếu hành vi này là không mong muốn, hãy gọi phương thức IsDefined để đảm bảo rằng một biểu diễn chuỗi cụ thể của một số nguyên thực sự là một thành viên của TEnum.

Gọi Enum.IsDefined để xác minh rằng giá trị bạn đã phân tích cú pháp thực sự tồn tại trong enum cụ thể này.

Nếu bạn đang xử lý [Flags] enums (bitmasks), nó sẽ trở nên phức tạp hơn.