Kontrol tidak dapat jatuh dari satu label kasus

156

Saya mencoba untuk menulis pernyataan beralih yang akan mengetik istilah pencarian di bidang pencarian tergantung pada kotak teks pencarian yang ada. Saya memiliki kode berikut. Tapi saya mendapatkan kesalahan "Kontrol tidak dapat gagal dari label satu kasus".

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

Kontrol tidak dapat dialirkan dari satu label kasus ( case "SearchBooks":) ke label lainnya

Kontrol tidak dapat dialirkan dari satu label kasus ( case "SearchAuthors":) ke label lainnya

Maya
sumber

Jawaban:

260

Anda melewatkan beberapa istirahat di sana:

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

Tanpa mereka, kompiler berpikir Anda mencoba untuk mengeksekusi baris di bawah case "SearchAuthors":segera setelah baris di bawah case "SearchBooks":telah dieksekusi, yang tidak diperbolehkan dalam C #.

Dengan menambahkan breakpernyataan di akhir setiap kasus, program keluar dari setiap kasus setelah selesai, untuk nilai berapa pun searchType.

BoltClock
sumber
31
Bagi saya, saya duduk di sana melihat kode ini dan kode saya sendiri sampai saya akhirnya menyadari bahwa saya benar-benar kehilangan kesempatan pada kasus terakhir, bagi siapa saja yang merasa terbantu.
somoso
13
Dan bagaimana jika solusi saya tidak memerlukan breakkarena perlu jatuh pada beberapa keadaan ?!
Hitam
10
wow, apa yang dipikirkan para C # devs ?! Ia bekerja di setiap bahasa pemrograman yang saya tahu, tetapi tidak dalam C #.
Hitam
8
Satu hal yang hilang dari jawaban ini adalah kenyataan bahwa Anda masih bisa menggunakan C-Style secara langsung goto case "some String".
NH.
3
Saya tidak pernah menyadari ini. Saya selalu berpikir VB tidak memiliki fitur fall-through case yang dimiliki C ++. Sekarang saya mengetahui bahwa C # tidak memilikinya, DAN untuk menambahkan penghinaan pada cedera, Anda harus mengetikkan pernyataan break. Itu bahkan tidak akan mengisi otomatis.
Brain2000
138

Anda perlu break;, throw, goto, atau returndari masing-masing label kasus Anda. Dalam satu lingkaran Anda juga bisa 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;
        }

Satu-satunya saat ini tidak benar adalah ketika label kasus ditumpuk seperti ini:

 case "SearchBooks": // no code inbetween case labels.
 case "SearchAuthors":
    // handle both of these cases the same way.
    break;
agen-j
sumber
2
continuemungkin juga
Tobias Valinski
3
Adakah yang bisa menjelaskan - mengapa ini? Saya merasa seperti ada kasus penggunaan yang sah untuk mengeksekusi kode dan memiliki kontrol terus jatuh ke kasus berikutnya.
YasharBahman
9
@YasharBahman, saya pikir ada lebih banyak bug daripada kasus yang dimaksud dalam bahasa yang mendukung kasus jatuh. Di C #, bahasa ini memungkinkan Anda goto case "SearchBooks";sehingga Anda memiliki kemampuan untuk melakukan apa yang perlu Anda lakukan tanpa kehilangan banyak ekspresif atau menambahkan bug yang tidak terduga.
agent-j
2
@ agen-j begitu. Terima kasih, itu masuk akal. Juga, saya tidak tahu Anda bisa menggunakan goto seperti itu, itu sangat keren! (walaupun, saya pikir saya akan selalu bosan menggunakannya karena profesor saya telah meyakinkan saya bahwa saya akan terbakar secara spontan jika saya melakukannya)
YasharBahman
2
Mengapa jawaban ini tidak diterima? Ini memberi tahu lebih banyak tentang opsi apa yang Anda miliki untuk pernyataan pergantian ditambah dengan memberikan jawaban untuk pertanyaan itu.
DotNet Programmer
30

Anda dapat melakukan lebih dari sekadar jatuh dalam C #, tetapi Anda harus menggunakan pernyataan goto "menakutkan". Sebagai contoh:

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

Anda perlu menambahkan pernyataan istirahat:

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

Ini mengasumsikan bahwa Anda ingin baik pegangan SearchBookskasus atau yang SearchAuthors- seperti yang Anda telah menulis dalam, dalam sebuah pernyataan C-gaya saklar tradisional aliran kontrol akan "jatuh melalui" dari satu kasus pernyataan makna berikutnya yang semua 4 baris kode dieksekusi dalam kasus di mana searchType == "SearchBooks".

Kesalahan kompiler yang Anda lihat diperkenalkan (setidaknya sebagian) untuk memperingatkan programmer tentang kesalahan potensial ini.

Sebagai alternatif, Anda bisa melempar kesalahan atau kembali dari suatu metode.

Justin
sumber
1
Apakah ada cara untuk meniru saklar mirip-C di sini? Jalankan beberapa kode dalam satu saklar dan kemudian jatuh ke yang lain yang akan berjalan untuk semua orang?
John Demetriou
@JohnDemetriou Anda dapat menggunakan pergi ke pernyataan kasus untuk meniru yang sama.
itsme.cvk
4

Di akhir setiap sakelar ganti tambahkan pernyataan break untuk menyelesaikan masalah ini seperti ini-

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

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

            }
Debendra Dash
sumber
4

Karena itu tidak disebutkan dalam jawaban lain, saya ingin menambahkan bahwa jika Anda ingin kasus SearchAuthors dieksekusi tepat setelah kasus pertama selesai, sama seperti kasusnya ketika menghilangkan "break" dalam beberapa bahasa pemrograman lain di mana itu diubah, Anda cukup menggunakan "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;
}
Ouissal
sumber
2

Anda melewatkan pernyataan istirahat. Jangan lupa untuk memasukkan pernyataan istirahat bahkan dalam kasus default.

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;

}
Husnain Shabbir
sumber
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();

        }
    }
}
Bob Maharjan
sumber
1
Anda harus memberikan beberapa kata atau sesuatu untuk menjelaskan mengapa ini solusi. Karena Anda tidak menjelaskan mengapa Anda perlu istirahat untuk beberapa dan bukan yang lain.
Programmer DotNet
3
maksud Anda "konsonan"?
maksymiuk
1
1. Saya pikir Anda berarti "vokal" vs. "alfabet". 2. Anda mungkin ingin mengubah switch (ch)yang berikut ini. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Maaf, harus. ;)
Tom