Контроль не может провалиться из одной метки случая - PullRequest
133 голосов
/ 14 июля 2011

Я пытаюсь написать оператор switch, который будет вводить поисковый термин в поле поиска в зависимости от того, какое текстовое поле поиска присутствует. У меня есть следующий код. Но я получаю сообщение об ошибке «Не удается выполнить контроль из одной метки». Пожалуйста, дайте мне знать, как это исправить. Заранее спасибо!

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":') к другой

Ответы [ 8 ]

226 голосов
/ 14 июля 2011

Вы пропустили некоторые разрывы:

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": были выполнены, что нене допускается в C #.

Добавляя операторы break в конце каждого случая, программа завершает каждый случай после его завершения для любого значения searchType.

127 голосов
/ 14 июля 2011

Вам нужно 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;
24 голосов
/ 16 марта 2016

Вы можете сделать больше, чем просто провалиться в C #, но вы должны использовать «страшный» оператор goto. Например:

switch (whatever)
{
  case 2:
    Result.Write( "Subscribe" );
    break;
  case 1:
    Result.Write( "Un" );
    goto case 2;
}
14 голосов
/ 14 июля 2011

Вам необходимо добавить оператор разрыва:

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 case или * SearchAuthors - как вы писали в традиционной инструкции переключения в стиле C, поток управления "провалился бы" «от одного оператора case к следующему, что означает, что все 4 строки кода выполняются в случае, когда searchType == "SearchBooks".

Ошибка компилятора, которую вы видите, была введена (по крайней мере частично), чтобы предупредить программиста об этой потенциальной ошибке.

В качестве альтернативы вы могли выдать ошибку или вернуться из метода.

3 голосов
/ 22 декабря 2017

В конце каждого случая переключения просто добавьте оператор break, чтобы решить эту проблему следующим образом:

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

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

            }
2 голосов
/ 09 апреля 2018

Вы пропустили операторы break. Не забудьте ввести оператор break даже в случае по умолчанию.

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;

}
2 голосов
/ 27 августа 2015
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 голос
/ 25 апреля 2019

Поскольку это не упоминалось в других ответах, я хотел бы добавить, что если вы хотите, чтобы SearchAuthors дел выполнялся сразу после первого случая, точно так же, как и в случае пропуска "break" в некоторых на других языках программирования, где это разрешено, вы можете просто использовать «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;
}
...