2010-02-02 17 views
9

के माध्यम से सभी कोड पथ नीचे कोड ठीक काम करता है का पालन कर सकते क्यों:नहीं सी # संकलक एक स्विच बयान

ListControl lstMyControl; 

if (SomeVariable == SomeEnum.Value1) 
{ 
    lstMyControl = new DropDownList(); 
} 
else 
{ 
    lstMyControl = new RadioButtonList(); 
} 

lstMyControl.CssClass = "SomeClass"; 

जबकि नीचे कोड संकलन नहीं होगा:

ListControl lstMyControl; 

    switch (SomeVariable) 
    { 
     case SomeEnum.Value1: 
     lstMyControl = new DropDownList(); 
     break; 
     case default: 
     lstMyControl = new RadioButtonList(); 
     break; 
    } 

lstMyControl.CssClass = "SomeClass"; 

दूसरे उदाहरण में संकलक कहता है कि मैं एक चर पर एक संपत्ति सेट करने की कोशिश कर रहा हूं जिसे तत्काल नहीं किया गया है। किसी भी मामले में lstMyControl को तत्काल चालू किया जाना चाहिए, लेकिन कंपिलर उस कोड पथ का पालन करने के लिए स्विच स्टेटमेंट का पालन नहीं कर सकता है। उपर्युक्त सरल उदाहरण में मैं बस/else का उपयोग करूंगा। लेकिन कुछ ऐसे समय हैं जब मैं 10 अलग-अलग वर्गों के साथ ऐसा कुछ करना चाहता था, जो सभी एक ही बेस क्लास से प्राप्त होते हैं और 10/यदि अन्यथा कथन कथन होता है तो मुझे स्विच कथन का उपयोग करना चाहिए।

+0

आगे उत्तर देने के लिए तत्पर हैं ... जावा उस तरह काट नहीं पाएगा ... और मुझे उम्मीद है कि सी # या तो नहीं होगा। – Romain

+0

अगर (कुछ उपलब्ध = कुछEnum.Value1) <- आपको यकीन है कि यह इसके बजाय तुलना नहीं होनी चाहिए? अगर (कुछ उपलब्ध == SomeEnum.Value1) –

+3

मुझे लगता है कि आपके दूसरे उदाहरण (लिखित के रूप में) में, कंपाइलर वास्तव में 'सिंटेक्स त्रुटि' कहता है, (उस लाइन पर 'अपेक्षित' जहां आपके पास 'केस डिफ़ॉल्ट है:'। इसे सही करें 'डिफ़ॉल्ट: 'और presto, सबकुछ काम करता है। – AakashM

उत्तर

17
ListControl lstMyControl; 

    switch (SomeVariable) 
    { 
     case SomeEnum.Value1: 
     lstMyControl = new DropDownList(); 
     break; 
     default: //Don't prefix with "case" 
     lstMyControl = new RadioButtonList(); 
     break; 
    } 

lstMyControl.CssClass = "SomeClass"; 
+0

@ जेफ एचए, हाँ, बस उस कोड को संकलित किया और यह मेरे लिए काम करता है। मुझे याद नहीं आया कि सी # इलाज 'केस डिफ़ॉल्ट' 'डिफ़ॉल्ट 'जैसा ही है। मैंने कल्पना की होगी कि सी # वास्तव में 'केस डिफ़ॉल्ट' पर एक कंपाइलर त्रुटि ट्रिगर करेगा। – Earlz

+0

यह एक कंपाइलर त्रुटि बनाता है, "सिंटेक्स त्रुटि," ('अपेक्षित "यह संदर्भ के बारे में थोड़ा उलझन में आता है जिसमें' डिफ़ॉल्ट 'का उपयोग किया जा रहा है – Adrian

+0

वाह, हाँ यह करता है। मुझे आश्चर्य है कि ओपी तब क्या बात कर रहा है? – Earlz

1

यह रूप में लंबे समय से काम करता है के रूप में आप "मामले" के साथ "डिफ़ॉल्ट" उपसर्ग नहीं है (Earlz ऊपर का कहना है के रूप में)। यह स्निपेट ठीक संकलित करता है। मैं जो त्रुटि संदेश देख रहा हूं उससे उलझन में हूं, "केस" को हटाने से मुझे एक वाक्यविन्यास त्रुटि मिलती है जो आप नहीं देख रहे हैं। क्या कुछ और चल रहा है?

ListControl lstMyControl; 

int switchVar = 0; 
switch (switchVar) 
{ 
    case 1: 
     lstMyControl = new DropDownList(); 
     break; 
    default: 
     lstMyControl = new RadioButtonList(); 
     break; 
} 

lstMyControl.CssClass = "SomeClass"; 
संबंधित मुद्दे