2012-08-08 25 views
5

Tôi đã có một enum như thế này trong một mảnh cũ của mã:Compile Thời gian chuyển đổi của uint để int trong C#

[Flags] 
public enum Example: uint 
{  
    Foo = 0x00000001, 
    Bar = 0xC0000000 
} 

Bây giờ, FxCop is complaining về enum này sử dụng uint chứ không phải là int như nó lĩnh vực sao lưu. (Và tôi đã được giao nhiệm vụ nhận mã này là FxCop sạch nhất có thể ...) Nhưng có một giá trị enum hiện có sử dụng bit thứ tự cao của enum, và tôi không thể thay đổi điều này vì nó đã được tiếp tục tồn tại định dạng trên đĩa. Khi tôi cố gắng biên dịch này, biên dịch C# một cách đúng đắn phàn nàn:

error CS0266: Cannot implicitly convert type 'uint' to 'int'. An explicit conversion exists (are you missing a cast?) 

Vì vậy, tôi sẽ thay đổi nó để thay này:

[Flags] 
public enum Example 
{  
    Foo = 0x00000001, 
    Bar = (int)0xC0000000 
} 

Tuy nhiên, tôi không tích cực mà tôi có thể dựa về điều này không ném ngoại lệ số học, hoặc không được xử lý một cách chính xác khi được đọc hoặc ghi vào đĩa. Tôi có thể dựa vào định dạng bit ở đây phù hợp với định dạng mà nó được sử dụng khi enum được hỗ trợ bởi một int không dấu?

+0

Điều này có thể không giải quyết được tất cả các sự cố FxCop của bạn. Tôi sẽ không ngạc nhiên nếu nó nói với bạn rằng bạn nên có một thành viên 'None' cho tất cả các enums' [Flags] '. Điều này có vẻ giống như một nơi rất tốt cho một cuộc đàn áp cảnh báo nội tuyến với một bình luận về lý do tại sao bạn không thể thay đổi mã. –

+0

@Cody: Vâng, tôi có thể sẽ làm điều đó. –

Trả lời

8

Sử dụng từ khóa không được chọn tại đây và bạn sẽ không sao; mẫu bit liên tục sẽ là những gì bạn mong đợi.

[Flags] 
public enum Example 
{ 
    Foo = 0x00000001, 
    Bar = unchecked((int)0xC0000000); 
} 
0

câu trả lời Thomas là 100% đúng, nhưng tôi sẽ bổ sung thêm ba xu của tôi với nó: thay vì "sửa chữa" code của bạn mà là đã chính xác, bạn luôn có thể đàn áp quy tắc FxCop đối với một số phần của mã này.

Xem How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage? và câu trả lời được chấp nhận cho ví dụ sử dụng. Tất cả mọi thứ được thiết lập trong mã và .csproj, vì vậy tất cả các thiết lập đàn áp như vậy vẫn ở lại với mã khi được đưa ra cho khách hàng cuối cùng.

+0

FxCop ở đó để tìm những thứ "đúng" là ý tưởng tồi. Nếu tôi đè nén mọi thứ, nó sẽ đánh bại vấn đề. (Để được rõ ràng, bởi "như FxCop sạch càng tốt" những gì tôi đang làm là đi qua đàn áp của chúng tôi và loại bỏ chúng) –

+1

Bình luận trước đây của tôi là một điều vô nghĩa. Những gì tôi đã cố gắng để nói là, bản thân .Net có đầy đủ các sự ức chế FxCop, hãy tự kiểm tra. Hầu hết mọi quy tắc đều có trường hợp khi quy tắc "nói chung đúng" nhưng thực sự không mong muốn. Tôi nghĩ rằng khả năng tương thích của bạn với lưu trữ cơ bản là trường hợp. Tất nhiên, trừ khi enum của bạn và lắp ráp có t obe được sử dụng trong các ngôn ngữ mà không có "unsigned" s. Dù sao, nếu bạn phải làm điều đó - làm điều đó :) Câu trả lời của Thomas là tuyệt vời. Tôi chỉ cần thêm của tôi cho đầy đủ. – quetzalcoatl

Các vấn đề liên quan