नियंत्रण एक केस लेबल से नहीं गिर सकता है


156

मैं एक स्विच स्टेटमेंट लिखने की कोशिश कर रहा हूं, जो भी सर्च टेक्स्टबॉक्स के आधार पर खोज क्षेत्र में खोज शब्द टाइप करेगा। मेरे पास निम्न कोड है। लेकिन मुझे "कंट्रोल एक केस लेबल से नहीं गिर सकता है" त्रुटि हो रही है।

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
}

नियंत्रण एक केस लेबल ( case "SearchBooks":) से दूसरे में नहीं गिर सकता है

नियंत्रण एक केस लेबल ( case "SearchAuthors":) से दूसरे में नहीं गिर सकता है

जवाबों:


260

आपने कुछ विराम को याद किया:

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
        break;

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
        break;
}

उनके बिना, कंपाइलर सोचता है कि आप लाइनों को निष्पादित करने के case "SearchAuthors":तुरंत बाद नीचे की पंक्तियों को निष्पादित करने की कोशिश कर रहे हैं case "SearchBooks":, जो कि सी # में अनुमति नहीं है।

breakप्रत्येक मामले के अंत में बयानों को जोड़कर , यह कार्यक्रम प्रत्येक मामले के समाप्त होने के बाद बाहर निकलता है, जिसके मूल्य के लिए searchType


31
मेरे लिए, मैं इस कोड को देख रहा था और अपने खुद के लिए जब तक मुझे पता नहीं चला कि मैं वास्तव में बहुत अंतिम मामले में ब्रेक को याद कर रहा था, जो किसी के लिए भी उपयोगी है।
सोमासो

13
और क्या होगा यदि मेरे समाधान के लिए कोई आवश्यकता नहीं है breakक्योंकि इसे कुछ परिस्थितियों में गिरने की आवश्यकता है ?!
ब्लैक

10
वाह, क्या बिल्ली सी # देव सोच रहे थे ?! यह मेरे द्वारा ज्ञात प्रत्येक प्रोग्रामिंग भाषा में काम करता है, लेकिन C # में नहीं।
ब्लैक

8
इस उत्तर को याद रखने वाली एक बात यह है कि आप अभी भी सी-स्टाइल फॉल-थ्रू का उपयोग कर सकते हैं goto case "some String"
एनएच।

3
मुझे कभी इसका एहसास नहीं हुआ। मुझे हमेशा लगा कि VB केस फॉल-थ्रू फीचर से गायब है जो C ++ में है। अब मुझे पता चला कि C # के पास भी नहीं है, और चोट के अपमान को जोड़ने के लिए, आपको ब्रेक स्टेटमेंट टाइप करना होगा। यह इसे ऑटोफिल भी नहीं करेगा।
ब्रेन 2000

138

आप की जरूरत के लिए break;, throw, goto, या returnअपने मामले लेबल में से प्रत्येक से। एक लूप में आप भी हो सकते हैं continue

        switch (searchType)
        {
            case "SearchBooks":
                Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
                break;

            case "SearchAuthors":
                Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
                break;
        }

केवल यही समय सच नहीं है जब केस लेबल इस तरह से स्टैक किए जाते हैं:

 case "SearchBooks": // no code inbetween case labels.
 case "SearchAuthors":
    // handle both of these cases the same way.
    break;

2
continueके रूप में अच्छी तरह से संभव है
Tobias Valinski

3
क्या कोई समझा सकता है-यह क्यों है? मुझे लगता है कि कोड को निष्पादित करने के लिए वैध उपयोग के मामले हैं और अगले मामले के माध्यम से नियंत्रण जारी है।
यशहरबहमान

9
@YasharBahman, मुझे लगता है कि भाषाओं में इच्छित मामलों की तुलना में कहीं अधिक कीड़े हैं जो केस फॉल-थ्रू का समर्थन करते हैं। C # में, भाषा आपको goto case "SearchBooks";ऐसा करने की अनुमति देती है, ताकि आप बहुत स्पष्टता खोए बिना या अप्रत्याशित बग को जोड़ने के लिए जो करने की आवश्यकता है, वह कर सकें।
j

2
@ एजेंट-जे मैं देख रहा हूं। धन्यवाद, यह बहुत मायने रखता है। इसके अलावा, मुझे नहीं पता था कि आप इस तरह गोटो का उपयोग कर सकते हैं, यह वास्तव में अच्छा है! (हालांकि, मुझे लगता है कि मैं हमेशा इसका इस्तेमाल करने से थका रहूंगा क्योंकि मेरे प्रोफेसरों ने मुझे आश्वस्त किया है कि अगर मैं ऐसा करूंगा तो मैं सहजता से
झड़प करूंगा

2
यह एक स्वीकृत उत्तर क्यों नहीं है? यह इस बारे में अधिक बताता है कि आपके पास स्विच स्टेटमेंट के अलावा और क्या विकल्प हैं जो प्रश्न का उत्तर देते हैं।
डॉटनेट प्रोग्रामर

30

आप C # के माध्यम से गिरने से अधिक कर सकते हैं, लेकिन आपको "खतरनाक" गोटो स्टेटमेंट का उपयोग करना होगा। उदाहरण के लिए:

switch (whatever)
{
  case 2:
    Result.Write( "Subscribe" );
    break;
  case 1:
    Result.Write( "Un" );
    goto case 2;
}

14

आपको एक ब्रेक स्टेटमेंट जोड़ने की जरूरत है:

switch (searchType)
{
case "SearchBooks":
    Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    break;
case "SearchAuthors":
    Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
    break;
}

मतलब यह है कि आप चाहते हैं या तो संभाल करने के लिए SearchBooksमामले याSearchAuthors - के रूप में आप में लिखा था एक पारंपरिक सी शैली स्विच बयान नियंत्रण प्रवाह होगा अगले अर्थ के एक मामले बयान से "के माध्यम से गिर गया" है में, कि कोड के सभी 4 लाइनों जहां मामले में निष्पादित हो searchType == "SearchBooks"

इस संभावित त्रुटि के प्रोग्रामर को चेतावनी देने के लिए संकलक त्रुटि जिसे आप देख रहे थे (कम से कम भाग में) पेश किया गया था।

एक विकल्प के रूप में आप एक त्रुटि फेंक सकते हैं या एक विधि से लौट सकते हैं।


1
क्या यहां सी-जैसे स्विच को दोहराने का कोई तरीका है? एक कोड में कुछ कोड चलाएं और फिर दूसरे के माध्यम से गिरें जो सभी के लिए चलेगा?
जॉन डेमेट्रियौ

@JohnDemetriou आप उसी को दोहराने के लिए केस स्टेटमेंट पर जा सकते हैं।
itsme.cvk

4

प्रत्येक स्विच केस के अंत में इस तरह इस समस्या को हल करने के लिए ब्रेक स्टेटमेंट जोड़ें-

           switch (manu)
            {
                case manufacturers.Nokia:
                    _phanefact = new NokiaFactory();
                    break;

                case manufacturers.Samsung:
                    _phanefact = new SamsungFactory();
                    break;

            }

4

चूंकि अन्य उत्तरों में इसका उल्लेख नहीं किया गया था, इसलिए मैं जोड़ना चाहूंगा कि यदि आप चाहते हैं कि मामला SearchAuthors को पहले मामले के ठीक बाद निष्पादित किया जाए, तो ऐसा ही कुछ अन्य प्रोग्रामिंग भाषाओं में "ब्रेक" को छोड़ते समय होता है जहां यह बदला हुआ है, आप बस "गोटो" का उपयोग कर सकते हैं।

switch (searchType)
{
    case "SearchBooks":
    Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    goto case "SearchAuthors";

    case "SearchAuthors":
    Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
    break;
}

2

आप ब्रेक स्टेटमेंट से चूक गए। डिफॉल्ट केस में भी ब्रेक स्टेटमेंट दर्ज करना न भूलें।

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
        break;

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
        break;
    default :
        Console.WriteLine("Default case handling");
        break;

}

0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Case_example_1
{
    class Program
    {
        static void Main(string[] args)
        {
            Char ch;
            Console.WriteLine("Enter a character");
            ch =Convert.ToChar(Console.ReadLine());
            switch (ch)
            {
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U':

                    Console.WriteLine("Character is alphabet");
                    break;

                default:
                    Console.WriteLine("Character is constant");
                    break;

            }

            Console.ReadLine();

        }
    }
}

1
आपको यह बताने के लिए कुछ शब्द या कुछ कहना चाहिए कि यह एक समाधान क्यों है। चूंकि आप यह नहीं समझाते हैं कि आपको कुछ और के लिए ब्रेक की आवश्यकता क्यों है।
डॉटनेट प्रोग्रामर

3
क्या आपका मतलब "व्यंजन" था?
maksymiuk

1
1. मुझे लगता है कि आपका मतलब "स्वर" बनाम "वर्णमाला" है। 2. आप switch (ch)निम्नलिखित को बदलना चाह सकते हैं । char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)क्षमा करें, करना पड़ा। ;)
टॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.