2010-04-12 37 views
7

Tôi cần phải sử dụng enum này trong ứng dụng C# của tôi, nhưng nó sẽ không cho phép tôi sử dụng các giá trị này. Khi tôi chỉ định kiểu như uint, tôi có thể sử dụng giá trị -1 và khi tôi chỉ định int, tôi không thể sử dụng 2 giá trị cuối cùng. Có cách nào để sử dụng từ khóa không được kiểm tra ở đây để cho phép tôi xác định tất cả các giá trị này không? Những giá trị này đến từ một nguồn bên ngoài, vì vậy tôi không thể thay đổi chúng.Làm cách nào để sử dụng các giá trị không an toàn trong enum?

internal enum MyValues : int 
{ 
    value1 = -1, 
    value2 = 0, 
    value3 = 0x80000000, 
    value4 = 0xFFFFFFFF 
} 

Trả lời

9

Nếu bạn muốn -1 là một giá trị khác nhau từ 0xFFFFFFFF, bạn sẽ cần một kiểu dữ liệu lớn hơn 32 bit. Hãy thử long.

+0

Sử dụng một kiểu dữ liệu 64bit không phải là một lựa chọn, tôi đang sử dụng interop để trả về một giá trị 32 bit. –

+0

Nếu -1 và 0xFFFFFFFF về mặt kỹ thuật là giống nhau khi sử dụng một uint, tôi đoán tôi chỉ có thể loại bỏ giá trị -1? –

+1

@Jon: -1 không tồn tại khi bạn đang sử dụng uint - bạn phải thực hiện chuyển đổi không được kiểm tra. –

1

Có thể thử thay thế enum thay vì int?

2

Vì các giá trị này trông không đổi, chỉ cần tạo một lớp tĩnh để giữ các giá trị. Ngoài ra, bạn có thể sử dụng bất cứ loại bạn muốn:

public static class MyValues 
{ 
    public const int value1 = -1; 
    public const int value2= 0; 
    public const int value3 = 0x80000000; 
    public const int value4 = 0xFFFFFFFF; 
} 
2

Một cách để giải quyết việc này là sử dụng các giá trị bình thường đối với các enum (0, 1, 2, 3), và tạo ra một lớp hoặc một cặp phương pháp để chuyển đổi các giá trị đến thành viên enum và ngược lại.

+0

Đã viết bài đăng lớn này và sau đó nhận thấy bạn đã nói điều tương tự. +1. @Jon Tackabury: Câu trả lời của @Jon Seigel là lựa chọn duy trì nhất. Đừng giả sử -1 là giống như 0xFFFFFFFF trừ khi bạn có kiến ​​thức rất thân mật của thư viện bạn đang sử dụng. – Randolpho

3

0xFFFFFFFF là một số 32 bit, vì vậy nó cần phải phù hợp để enum: int (Tôi cảm thấy loại dài là một overkill :))

Các bạn đã thử

enum YourEnum : int { /*...*/, value4 = unchecked((int)0xFFFFFFFF) }; 
Các vấn đề liên quan