2009-10-27 12 views
6

सी # 3 (विजुअल स्टूडियो 2008) ने भाषा में एक ब्रेकिंग परिवर्तन शुरू किया (http://msdn.microsoft.com/en-us/library/cc713578.aspx, परिवर्तन 12 देखें) जो किसी भी शाब्दिक शून्य को पूर्ण रूप से एनम में परिवर्तित करने की अनुमति देता है। यह कई तरीकों से अजीब लगता है। क्या किसी को पता है कि यह कल्पना का हिस्सा क्यों है? एक शाब्दिक क्यों नहीं? या सात? शून्य विशेष क्यों है? और यह कुछ बहुत ही counterintuitive अधिभार संकल्प विकल्प बनाता है। उदाहरण के लिए।सी # 3 किसी भी एनम के लिए शाब्दिक शून्य (0) के अंतर्निहित रूपांतरण की अनुमति क्यों देता है?

function string F(object o) { return o.ToString(); } 
function string F(DbType t) { return t.ToString(); } 
int i = 0; 
F((long)0) == "String" // would have been "0" in VS 2005 
F(0) == "String" 
F(i) == "0" 

बहुत भ्रमित, और जानबूझकर भाषा में एक जानबूझकर पेश किया गया परिवर्तन। कोई विचार?

+0

यदि आप किसी प्रश्न में इतनी कठोर परिवर्तन करने जा रहे हैं (विशेष रूप से जो पहले से ही उत्तर देने के लिए वोट दिया गया है), तो यह सबसे अच्छा होगा - उत्तरदाताओं, ब्राउज़रों और आप के लिए - एक नया प्रश्न बनाने के लिए। अब आपके पास दो अलग-अलग प्रश्नों के उत्तर होंगे, जिनमें से पहला आकस्मिक ब्राउज़र शायद संपादन इतिहास में कभी नहीं देखेगा। – joshperry

+0

और जादू की तरह, सवाल को वापस अपने मूल भ्रामक रूप में संपादित किया गया है! यह ध्यान दिया जाना चाहिए कि दिया गया नमूना वीएस 2008 में नहीं टूटा हुआ है। मैं यह परिवर्तन करूँगा और देख सकता हूं कि यह चिपक जाता है ... –

उत्तर

10

सी # हमेशा किसी भी Enum मान के लिए शाब्दिक 0 के अंतर्निहित रूपांतरण की अनुमति दी है। क्या बदल गया है यह है कि नियम निरंतर अभिव्यक्तियों पर कैसे लागू होता है। इसे अधिक सुसंगत बनाने के लिए बनाया गया था और किसी निरंतर अभिव्यक्ति की अनुमति देता है जो 0 को मूल्यांकन करता है ताकि पूर्ण रूप से एक enum में परिवर्तनीय हो सके।

आपके द्वारा दिया गया उदाहरण सी # के सभी संस्करणों में एक ही व्यवहार पैदा करता है।

 
0 => A(Enum E) 
(int) E.Zero => A(object)

विज़ुअल सी # 2008 उत्पादन:

यहाँ (linked documentation से सीधे) बदली हुई व्यवहार का एक उदाहरण

public enum E 
{ 
    Zero = 0, 
    One = 1, 
} 

class A 
{ 
    public static A(string s, object o) 
    { System.Console.WriteLine("{0} => A(object)", s); } 

    public static A(string s, E e) 
    { System.Console.WriteLine("{0} => A(Enum E)", s); } 

    static void Main() 
    { 
     A a1 = new A("0", 0); 
     A a3 = new A("(int) E.Zero", (int) E.Zero); 
    } 
} 

Visual C# 2005 उत्पादन होता है

 
0 => A(Enum E) 
(int) E.Zero => A(Enum E)
+0

आह, एक अच्छा बिंदु। हमारे आवेदन का उदाहरण वास्तव में प्रोग्रामर (लंबा) 0. था। शायद पहले के संस्करण में जो 'निरंतर अभिव्यक्ति' नियम को ट्रिगर नहीं करता था। प्रश्न अभी भी खड़ा है: क्यों यदि कोई अन्य पूर्णांक एनम के लिए पूरी तरह से परिवर्तनीय नहीं है तो शून्य क्यों है? –

+0

@ सेबेस्टियन, मैं इस बिंदु पर निश्चित नहीं हूं। शायद एक बहुत ही रोचक भाषा कारण है और उम्मीद है कि एरिक बाद में इस पर टिप्पणी करने के लिए होगा। – JaredPar

+0

एक निरंतर अभिव्यक्ति कोई अभिव्यक्ति है जिसे संकलन-समय पर स्थिर मान के परिणामस्वरूप निर्धारित किया जा सकता है (अभिव्यक्ति के परिणाम का मूल्य स्रोत कोड में प्रतिस्थापित नहीं किया जा सकता है)। वीएस 2005 में केवल "शाब्दिक" शून्यों को पूर्ण रूप से enums में परिवर्तित किया गया था,> = वीएस 2008 में शून्य "का मूल्यांकन करने वाले किसी भी" स्थिर अभिव्यक्ति "को पूरी तरह से परिवर्तित किया जाएगा। – joshperry

1

इसे संस्करण 1.0 के बाद से अनुमति दी गई है। यह एक enum का डिफ़ॉल्ट मान है।

"एक शाब्दिक 0 परोक्ष परिवर्तनीय किसी भी enum प्रकार है। विजुअल C# में संकलक के 2005 और पिछले संस्करणों, वहाँ भी कुछ निरंतर भाव कि 0 के रूप में मूल्यांकित कि परोक्ष किसी भी करने के लिए परिवर्तित कर सकते हैं कर रहे हैं enum प्रकार है, लेकिन नियम है कि जो इन भाव के हैं परिवर्तनीय स्पष्ट नहीं है निर्धारित करता है। विजुअल C# 2008 में, सभी निरंतर भाव हैं कि 0 के बराबर परोक्ष किसी भी enum प्रकार के लिए परिवर्तित हो सकता है। "

3

मुझे लगता है कि ऐसा इसलिए है क्योंकि 0 को enums का "डिफ़ॉल्ट मान" माना जाता है।

सी # (डिफ़ॉल्ट कीवर्ड में पेश किया गया था सी # 2,0)

enum DbType { 
    Unspecified, 
    SqlServer 
} 

DbType t; 
int i = 0; 

Console.WriteLine(t == i); 
Console.WriteLine(i == default(DbType)); 

आउटपुट:

True 
True 
+0

मुझे लगता है कि यह काफी सटीक है क्योंकि 'डिफ़ॉल्ट (टी) '1.0 में मौजूद नहीं था, और वे उस भाषा में असंगतता नहीं लेना चाहते थे जहां आप एनम वैरिएबल डिफॉल्ट प्राप्त कर सकते थे-जिसे '0' पर शुरू किया गया था, लेकिन स्पष्ट रूप से नहीं (बिना किसी कलाकार के)। –

+0

@Pavel Minaev - मुझे यह सिद्धांत पसंद है। –

0

"गणना तत्वों का डिफ़ॉल्ट अंतर्निहित प्रकार int है। डिफ़ॉल्ट रूप से, पहले गणनाकर्ता के पास मूल्य 0 होता है, और प्रत्येक क्रमिक गणनाकर्ता का मान 1 से बढ़ जाता है। "- यह MSDN notes for 1.1 framework से है, इसलिए यह हमेशा होता है।

0

जैसा कि अन्य ने उल्लेख किया है, 0 डिफ़ॉल्ट है enum।enumerations के बारे में सोच के रूप में निम्नानुसार (एक और अधिक स्पष्ट फैशन में) का प्रयास करें:

public enum HairColor 
{ 
    Blonde   = 0x0000; 
    Brunett   = 0x0001; 
    Red    = 0x0002; 
    StrawberryBlonde = 0x0004; 
} 

क्योंकि आप किसी दिए गए गणन के अपने मूल्यों में स्पष्ट नहीं किया जा रहा है, सी # स्वतः यह एक डिफ़ॉल्ट मान प्रदान करेंगे। यदि आप इसे नहीं चाहते हैं, तो आपको किसी दिए गए गणना के लिए मूल्यों को स्पष्ट रूप से परिभाषित करना होगा।

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

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