2012-08-08 3 views
5

मैं कोड के एक पुराने टुकड़ा में इस तरह की एक enum मिल गया है:संकलन समय uint के रूपांतरण में int करने के लिए सी #

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

अब, FxCop is complaining इस enum के बारे में नहीं बल्कि पूर्णांक के रूप में यह क्षेत्र का समर्थन कर रहा है की तुलना में uint का उपयोग कर। (और मुझे इस कोड को FxCop जितना संभव हो सके साफ़ करने के साथ काम किया गया है ...) लेकिन एक मौजूदा enum मान है जो enum के उच्च क्रम बिट का उपयोग करता है, और मैं इसे बदल नहीं सकता क्योंकि यह जारी रहा है ऑन-डिस्क प्रारूप। जब मैं इस संकलन करने का प्रयास करें, सी # संकलक ठीक ही शिकायत:

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

तो, मैं इस के बजाय करने के लिए इसे बदलने के लिए जा रहा था:

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

हालांकि, मैं सकारात्मक है कि मैं भरोसा कर सकते हैं नहीं कर रहा हूँ इस पर अंकगणितीय अपवाद फेंक नहीं, या डिस्क पर पढ़ने या लिखे जाने पर सही ढंग से संभाला नहीं जा रहा है। क्या मैं यहां प्रारूप के मिलान से थोड़ा सा प्रारूप पर भरोसा कर सकता हूं, जब एनम को एक हस्ताक्षरित int द्वारा समर्थित किया गया था?

+0

यह आपकी सभी FxCop समस्याओं को हल नहीं कर सकता है। मुझे आश्चर्य नहीं होगा अगर उसने आपको बताया कि आपके पास सभी 'ध्वज]' enums के लिए 'कोई नहीं' सदस्य होना चाहिए। यह एक इनलाइन चेतावनी दमन के लिए एक बहुत अच्छी जगह की तरह लगता है कि आप कोड क्यों नहीं बदल सकते हैं। –

+0

@ कोडी: हाँ, मैं ऐसा कर सकता हूं। –

उत्तर

8

अनचेक किए गए कीवर्ड का उपयोग यहां करें और आप ठीक रहेगा; दृढ़ बिट पैटर्न आप अपेक्षा करेंगे।

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

थॉमस के जवाब 100% सही है, लेकिन मैं इसे करने के लिए अपने तीन सेंट जोड़ना होगा: "फिक्सिंग" अपने कोड जो पहले से ही सही था के बजाय, आप हमेशा कोड के कुछ भाग के लिए FxCop नियम दबाने सकते।

How do I suppress FxCop rule 'DoNotCatchGeneralExceptionTypes' with SupressMessage? देखें और यह उपयोग के उदाहरण के लिए स्वीकार्य उत्तर है। सब कुछ कोड और .csproj में सेट है, इसलिए अंत क्लाइंट को दिए जाने पर ऐसी सभी दमन सेटिंग्स कोड के साथ रहती हैं।

+0

FxCop "सही" चीजें खोजने के लिए है जो बुरे विचार हैं। अगर मैं सब कुछ दबाता हूं तो यह बिंदु को पराजित करता है। (स्पष्ट होने के लिए, "जितना संभव हो सके FxCop स्वच्छ" द्वारा मैं जो कर रहा हूं वह हमारे दमनों के माध्यम से जा रहा है और उन्हें हटा रहा है) –

+1

मेरी पिछली टिप्पणी एक बकवास थी। जो मैं कहने की कोशिश कर रहा था वह था कि नेट खुद FxCop दमन से भरा है, अपने लिए जांचें। लगभग हर नियम के लिए एक ऐसा मामला होता है जब नियम "आम तौर पर सही" होता है लेकिन वास्तव में अवांछित होता है। मुझे लगता है कि अंतर्निहित भंडारण के साथ आपकी संगतता मामला है। बेशक, जब तक कि आपके enum और assembly में उन भाषाओं में उपयोग नहीं किया जाता है जिनके पास "हस्ताक्षरित" नहीं है। वैसे भी, अगर आपको यह करना है - इसे करें :) थॉमस का जवाब बहुत अच्छा है। मैंने बस पूर्णता के लिए मेरा जोड़ा। – quetzalcoatl

संबंधित मुद्दे