El control no puede pasar de una etiqueta de caso


156

Estoy tratando de escribir una declaración de cambio que escriba el término de búsqueda en el campo de búsqueda según el cuadro de texto de búsqueda que esté presente. tengo el siguiente código. Pero recibo el error "El control no puede fallar desde una etiqueta de caso".

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

El control no puede pasar de una etiqueta de caso ( case "SearchBooks":) a otra

El control no puede pasar de una etiqueta de caso ( case "SearchAuthors":) a otra

Respuestas:


260

Te perdiste algunos descansos allí:

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

Sin ellos, el compilador cree que está intentando ejecutar las líneas de abajo case "SearchAuthors":inmediatamente después de que case "SearchBooks":se hayan ejecutado las líneas de abajo , lo que no está permitido en C #.

Al agregar las breakdeclaraciones al final de cada caso, el programa sale de cada caso después de que se hace, por el valor de searchType.


31
Para mí, me senté allí mirando este código y el mío hasta que finalmente me di cuenta de que realmente me estaba perdiendo el descanso en el último caso, para cualquiera que lo encuentre útil.
somoso

13
¿Y qué breakpasa si mi solución no requiere porque necesita fallar en algunas circunstancias?
Negro

10
wow, ¿qué diablos estaban pensando los desarrolladores de C #? Funciona en todos los lenguajes de programación que conozco, pero no en C #.
Negro

8
Lo único que le falta a esta respuesta es el hecho de que aún puede hacer fallas de estilo C utilizando goto case "some String".
NH.

3
Nunca me di cuenta de esto. Siempre pensé que a VB le faltaba la función de caída de casos que tiene C ++. Ahora descubro que C # tampoco lo tiene, Y para agregar insulto a la lesión, debe escribir la declaración de interrupción. Ni siquiera lo rellenará automáticamente.
Brain2000

138

Es necesario que break;, throw, goto, oreturn de cada una de las etiquetas de caso. En un bucle también puedes 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;
        }

El único momento en que esto no es cierto es cuando las etiquetas de los casos se apilan así:

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

2
continuees posible también
Tobias Valinski

3
¿Alguien puede explicar -por qué- esto es? Siento que hay casos de uso legítimos para ejecutar código y que el control continúe hasta el próximo caso.
YasharBahman

9
@YasharBahman, creo que hay muchos más errores que los casos previstos en los idiomas que admiten casos fallidos. En C #, el lenguaje le permite hacerlo goto case "SearchBooks";para que tenga la capacidad de hacer lo que necesita hacer sin perder mucha expresividad o agregar errores inesperados.
agent-j

2
@ agente-j Ya veo. Gracias, eso tiene mucho sentido. Además, no sabía que podías usar goto así, ¡eso es genial! (aunque creo que siempre estaré cansado de usarlo ya que mis profesores me han convencido de que me
quemaré

2
¿Por qué esta no es la respuesta aceptada? Le brinda más información sobre las opciones que tiene para una declaración de cambio y le da la respuesta a la pregunta.
Programador DotNet

30

Puede hacer más que simplemente caer en C #, pero debe utilizar la declaración "goto" temida. Por ejemplo:

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

14

Necesita agregar una declaración de interrupción:

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

Esto supone que desea manejar el SearchBookscaso o el SearchAuthors- como había escrito, en una declaración de cambio de estilo C tradicional el flujo de control habría "caído" de una declaración de caso a la siguiente, lo que significa que las 4 líneas de código ser ejecutado en el caso donde searchType == "SearchBooks".

El error del compilador que está viendo se introdujo (al menos en parte) para advertir al programador de este posible error.

Como alternativa, podría haber arrojado un error o regresado de un método.


1
¿Hay alguna manera de replicar el interruptor tipo C aquí? ¿Ejecutar algún código en un interruptor y luego caer en otro que se ejecutará para todos?
John Demetriou

@ JohnDemetriou Puede usar las declaraciones de ir a caso para replicar lo mismo.
itsme.cvk

4

Al final de cada caso de cambio, simplemente agregue la declaración de interrupción para resolver este problema de esta manera:

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

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

            }

4

Dado que no se mencionó en las otras respuestas, me gustaría agregar que si desea que los CaseAuthors se ejecuten inmediatamente después de que se haga el primer caso, al igual que ocurre cuando se omite el "descanso" en algunos otros lenguajes de programación donde está permitido, simplemente puede usar "goto".

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

Te perdiste las declaraciones de ruptura. No olvides ingresar la declaración de ruptura incluso en el caso predeterminado.

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
Debe poner algunas palabras o algo para explicar por qué esta es una solución. Ya que no explica por qué necesita los descansos para algunos y no para otros.
Programador DotNet

3
¿quiso decir "consonante"?
maksymiuk

1
1. Creo que quisiste decir "vocal" versus "alfabeto". 2. Es posible que desee cambiar switch (ch)a lo siguiente. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Lo siento, tuve que hacerlo. ;)
Tom
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.