Die Kontrolle kann nicht von einem Falletikett durchfallen


156

Ich versuche, eine switch-Anweisung zu schreiben, die den Suchbegriff in das Suchfeld eingibt, je nachdem, welches Suchtextfeld vorhanden ist. Ich habe den folgenden Code. Ich erhalte jedoch den Fehler "Kontrolle kann nicht von einem Falletikett durchfallen".

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']");
}

Die Kontrolle kann nicht von einem Falletikett ( case "SearchBooks":) zum anderen durchfallen

Die Kontrolle kann nicht von einem Falletikett ( case "SearchAuthors":) zum anderen durchfallen

Antworten:


260

Sie haben dort einige Pausen verpasst:

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;
}

Ohne sie glaubt der Compiler, dass Sie versuchen, die folgenden Zeilen case "SearchAuthors":unmittelbar nach der Ausführung der Zeilen unter auszuführen case "SearchBooks":, was in C # nicht zulässig ist.

Durch Hinzufügen der breakAnweisungen am Ende eines jeden Falls beendet das Programm jeden Fall, nachdem er abgeschlossen ist, für welchen Wert auch immer searchType.


31
Für mich saß ich da und schaute mir diesen und meinen Code an, bis mir endlich klar wurde, dass ich die Pause im allerletzten Fall tatsächlich verpasst hatte, für jeden, der das hilfreich findet.
Somoso

13
Und was ist, wenn meine Lösung Nein erfordert, breakweil sie unter bestimmten Umständen durchfallen muss?!
Schwarz

10
Wow, was zum Teufel dachten die C # -Entwickler?! Es funktioniert in jeder mir bekannten Programmiersprache, aber nicht in C #.
Schwarz

8
Das einzige, was dieser Antwort fehlt, ist die Tatsache, dass Sie weiterhin C-Style-Fall-Throughs mit verwenden können goto case "some String".
NH.

3
Ich habe das nie bemerkt. Ich dachte immer, dass VB die Fall-Through-Funktion von C ++ vermisst. Jetzt finde ich heraus, dass C # es auch nicht hat, UND um die Verletzung zu beleidigen, müssen Sie die break-Anweisung eingeben. Es wird nicht einmal automatisch ausgefüllt.
Brain2000

138

Sie müssen sich break;, throw, goto, oder returnvon jedem Ihrer Fall Etiketten. In einer Schleife können Sie auch 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;
        }

Dies ist nur dann nicht der Fall, wenn die Falletiketten wie folgt gestapelt sind:

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

2
continueist auch möglich
Tobias Valinski

3
Kann jemand erklären, warum das so ist? Ich habe das Gefühl, dass es legitime Anwendungsfälle gibt, um Code auszuführen und die Kontrolle über den nächsten Fall fortzusetzen.
YasharBahman

9
@YasharBahman, ich denke, es gibt weit mehr Fehler als beabsichtigte Fälle in Sprachen, die Fallfall unterstützen. In C # können Sie mit der Sprache goto case "SearchBooks";das tun, was Sie tun müssen, ohne viel Ausdruckskraft zu verlieren oder unerwartete Fehler hinzuzufügen.
Agent-j

2
@ agent-j Ich verstehe. Danke, das macht sehr viel Sinn. Außerdem wusste ich nicht, dass du so etwas gebrauchen kannst, das ist wirklich cool! (obwohl ich denke, ich werde es immer müde sein, es zu benutzen, da meine Professoren mich überzeugt haben, dass ich mich spontan verbrennen werde, wenn ich es tue)
YasharBahman

2
Warum ist dies nicht die akzeptierte Antwort? Hier erfahren Sie mehr darüber, welche Optionen Sie für eine switch-Anweisung haben, und geben die Antwort auf die Frage.
DotNet Programmer

30

Sie können mehr als nur in C # durchfallen, aber Sie müssen die "gefürchtete" goto-Anweisung verwenden. Beispielsweise:

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

14

Sie müssen eine break-Anweisung hinzufügen:

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;
}

Dies setzt voraus , dass Sie die zu jedem Griff wollen SearchBooksFall oder die SearchAuthors- wie Sie in, hätte von einem Fall Aussage auf die nächste Bedeutung , dass alle vier Zeilen Code „geplatzt“ in einer traditionellen Fluss C-Stil switch - Anweisung der Steuerung geschrieben in dem Fall ausgeführt werden, in dem searchType == "SearchBooks".

Der angezeigte Compilerfehler wurde (zumindest teilweise) eingeführt, um den Programmierer vor diesem möglichen Fehler zu warnen.

Alternativ könnten Sie einen Fehler ausgelöst oder von einer Methode zurückgegeben haben.


1
Gibt es hier eine Möglichkeit, den C-ähnlichen Schalter zu replizieren? Führen Sie einen Code in einem Switch aus und fallen Sie dann zu einem anderen durch, der für alle ausgeführt wird?
John Demetriou

@JohnDemetriou Sie können go to case-Anweisungen verwenden, um diese zu replizieren.
itsme.cvk

4

Fügen Sie am Ende jedes Switch-Falls einfach die break-Anweisung hinzu, um dieses Problem wie folgt zu beheben:

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

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

            }

4

Da dies in den anderen Antworten nicht erwähnt wurde, möchte ich hinzufügen, dass SearchAuthors direkt nach Abschluss des ersten Falls ausgeführt werden soll, genau wie dies der Fall ist, wenn die "Pause" in einigen anderen Programmiersprachen weggelassen wird wo das erlaubt ist, kannst du einfach "goto" verwenden.

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

Sie haben break-Anweisungen verpasst. Vergessen Sie nicht, break-Anweisungen auch im Standardfall einzugeben.

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
Sie sollten ein paar Worte oder etwas sagen, um zu erklären, warum dies eine Lösung ist. Da du nicht erklärst, warum du die Pausen für einige und nicht für andere brauchst.
DotNet Programmer

3
Meinten Sie "Konsonant"?
Maksymiuk

1
1. Ich denke, Sie meinten "Vokal" gegen "Alphabet". 2. Möglicherweise möchten Sie switch (ch)Folgendes ändern . char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Entschuldigung, musste. ;)
Tom
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.