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