Контроль не может провалиться с одного ярлыка случая - программирование
Подтвердить что ты не робот

Контроль не может провалиться с одного ярлыка случая

Я пытаюсь написать оператор 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::) на другой

Управление не может проваливаться с одного ярлыка случая ( "случай" SearchAuthors ": ') на другой

4b9b3361

Ответ 1

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

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.

Ответ 2

Вам нужно break;, throw, goto или return от каждого из ваших ярлыков case. В цикле вы также можете 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 складываются следующим образом:

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

Ответ 3

Вы можете сделать больше, чем просто провалиться на С#, но вы должны использовать "страшную" инструкцию goto. Например:

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

Ответ 4

Вам нужно добавить оператор 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;
}

Предполагается, что вы хотите либо обработать случай SearchBooks , либо SearchAuthors - как вы уже писали, в традиционном заявлении о переключении в стиле C поток управления "упал" через "от одного случая к следующему значению, что все 4 строки кода выполняются в случае, когда searchType == "SearchBooks".

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

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

Ответ 5

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

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

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

            }

Ответ 6

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();

        }
    }
}

Ответ 7

Вы пропустили операторы 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;

}

Ответ 8

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