2013-08-09 8 views
10

सी # में, यदि हम enum को परिभाषित करते हैं जिसमें एक नकारात्मक मान के अनुरूप सदस्य होता है, और फिर हम उस enum के मानों पर फिर से सक्रिय होते हैं, तो नकारात्मक मान पहले नहीं आता है, लेकिन आखिरी है। ऐसा क्यों होता है? अन्य भाषाओं में (सी, सी ++, एडीए, इत्यादि), enum पर पुनरावृत्ति आपको वह आदेश देगा जिसमें आपने इसे परिभाषित किया था।ऋणात्मक enum सदस्यों का अनुमान लगाया गया है कि आखिरी बार अनुमान लगाया गया है?

MSDN है एक अच्छा example of this behavior:

using System; 

enum SignMagnitude { Negative = -1, Zero = 0, Positive = 1 }; 

public class Example 
{ 
    public static void Main() 
    { 
     foreach (var value in Enum.GetValues(typeof(SignMagnitude))) 
     { 
      Console.WriteLine("{0,3}  0x{0:X8}  {1}", 
           (int) value, ((SignMagnitude) value)); 
     } 
    } 
} 

// The example displays the following output: 
//   0  0x00000000  Zero 
//   1  0x00000001  Positive 
//  -1  0xFFFFFFFF  Negative 
+2

इसे शायद हस्ताक्षरित के रूप में क्रमबद्ध किया जा रहा है। – SLaks

+4

आपने इसे [* एक * कई प्रोग्रामर की तुलना में एक कदम आगे बढ़ाया] (http://stackoverflow.com/questions/18095665/a-lambda-expression-with-a-statement-body-cannot-be-converted-to-an - संपीड़न-टी/18095816 # टिप्पणी 26488750_18095816) दस्तावेज बनाने के द्वारा। अगली बार, इसे पढ़ें: "सरणी के तत्वों को गणना स्थिरांक के बाइनरी मानों द्वारा क्रमबद्ध किया जाता है (** अर्थात, उनके हस्ताक्षरित परिमाण ** द्वारा)।" – jason

+0

उसी [एमएसडीएन] (http://msdn.microsoft.com/en-us/library/system.enum.getvalues.aspx) आलेख से: "सरणी के तत्वों को गणना स्थिरांक के द्विआधारी मूल्यों द्वारा क्रमबद्ध किया जाता है (यानी, उनके हस्ताक्षरित परिमाण से)। " – natenho

उत्तर

15

the very documentation page you link to से, मेरे जोर:

सरणी के तत्वों गणन स्थिरांक की द्विआधारी मूल्यों (है कि उनके द्वारा, है द्वारा हल कर रहे हैं हस्ताक्षर परिमाण)।

CLR कोड (2.0 SSCLI) और अब तक निचले स्तर की तुलना में मैं वास्तव में के साथ सहज हूँ हो रही में खुदाई, ऐसा लगता है अंत में यह है की तरह है क्योंकि आंतरिक enum मूल्यों कुछ है कि इस तरह दिखता है (नोट में जमा हो जाती है इस सी ++) है:

class EnumEEClass : public EEClass 
{ 
    friend class EEClass; 

private: 

    DWORD   m_countPlusOne; // biased by 1 so zero can be used as uninit flag 
    union 
    { 
     void  *m_values; 
     BYTE  *m_byteValues; 
     USHORT  *m_shortValues; 
     UINT  *m_intValues; 
     UINT64  *m_longValues; 
    }; 
    LPCUTF8   *m_names; 

के रूप में देखा जा सकता है, यह अहस्ताक्षरित प्रकार है कि वास्तविक मान पकड़ है - इसलिए जब इन मूल्यों गणन के लिए उत्सर्जित कर रहे हैं, स्वाभाविक रूप से वे अपने अहस्ताक्षरित क्रम में हैं।

+8

दिलचस्प बात यह है कि यह एक बग के रूप में शुरू हुआ (http://connect.microsoft.com/VisualStudio/feedback/details/98147/enum-getvalues)। यदि आप 3.5 से पहले दस्तावेज़ीकरण के पहले संस्करणों को देखते हैं तो कोई आधिकारिक उल्लेख नहीं है कि यह उनके हस्ताक्षरित परिमाण का उपयोग करता है। मौजूदा अनुप्रयोगों को तोड़ने के बिना इसे ठीक करने में असमर्थता के कारण, मुझे लगता है कि उन्होंने अभी दस्तावेज़ों को अपडेट किया है: डी – keyboardP

+1

धन्यवाद @keyboardP, यही वह है जो मैं वास्तव में पूछ रहा था। – gmletzkojr

+1

अच्छा जवाब। हालांकि, यह मानता है कि पाठक को पता है कि नकारात्मक संख्याओं का प्रतिनिधित्व कैसे किया जाता है (वास्तव में [दो पूरक] (http://en.wikipedia.org/wiki/Signed_number_representation), हालांकि [सी # spec] (http: //www.ecma- international.org/publications/standards/Ecma-334.htm) हस्ताक्षरित पूर्णांक का प्रतिनिधित्व करने के लिए स्पष्ट रूप से इस विधि की आवश्यकता नहीं है)।यह ज्ञान समझना जरूरी है कि उन्हें बिना हस्ताक्षर किए जाने का इलाज क्यों सकारात्मक संख्याओं के बाद उनका पालन करता है। – stakx

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

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