Kiểm soát không thể rơi vào từ một nhãn trường hợp


156

Tôi đang cố gắng viết một câu lệnh chuyển đổi sẽ gõ cụm từ tìm kiếm trong trường tìm kiếm tùy thuộc vào bất kỳ hộp văn bản tìm kiếm nào có mặt. Tôi có mã sau đây. Nhưng tôi nhận được lỗi "Kiểm soát không thể rơi vào từ một trường hợp nhãn".

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

Kiểm soát không thể rơi từ nhãn trường hợp này ( case "SearchBooks":) sang nhãn khác

Kiểm soát không thể rơi từ nhãn trường hợp này ( case "SearchAuthors":) sang nhãn khác

Câu trả lời:


260

Bạn đã bỏ lỡ một số giờ nghỉ ở đó:

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

Không có chúng, trình biên dịch nghĩ rằng bạn đang cố thực hiện các dòng bên dưới case "SearchAuthors":ngay sau khi các dòng bên dưới case "SearchBooks":đã được thực thi, điều này không được phép trong C #.

Bằng cách thêm các breakcâu lệnh vào cuối mỗi trường hợp, chương trình sẽ thoát khỏi từng trường hợp sau khi hoàn thành, với giá trị nào searchType.


31
Đối với tôi, tôi ngồi đó nhìn mã này và mã của riêng tôi cho đến khi cuối cùng tôi nhận ra rằng tôi thực sự đã bỏ lỡ thời gian nghỉ trong trường hợp cuối cùng, cho bất cứ ai thấy điều đó hữu ích.
ai đó

13
Và điều gì xảy ra nếu giải pháp của tôi không cần breakbởi vì nó cần phải vượt qua trong một số trường hợp?!
Đen

10
wow, các nhà phát triển C # đang nghĩ cái quái gì vậy?! Nó hoạt động trong mọi ngôn ngữ lập trình mà tôi biết, nhưng không phải trong C #.
Đen

8
Điều duy nhất mà câu trả lời này còn thiếu là thực tế là bạn vẫn có thể thực hiện các thao tác thông qua C-Style goto case "some String".
NH.

3
Tôi chưa bao giờ nhận ra điều này. Tôi luôn nghĩ rằng VB đã thiếu tính năng thông qua trường hợp mà C ++ có. Bây giờ tôi phát hiện ra rằng C # cũng không có, VÀ để thêm sự xúc phạm đến thương tích, bạn phải gõ câu lệnh phá vỡ. Nó thậm chí sẽ không tự động điền nó.
Brain2000

138

Bạn cần break;, throw, goto, hoặc returntừ mỗi trường hợp nhãn của bạn. Trong một vòng lặp bạn cũng có thể 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;
        }

Lần duy nhất điều này không đúng là khi các nhãn thùng được xếp chồng lên nhau như thế này:

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

2
continuecũng có thể như vậy
Tobias Valinski

3
Bất cứ ai có thể giải thích - tại sao- đây là? Tôi cảm thấy như có các trường hợp sử dụng hợp pháp để thực thi mã và có quyền kiểm soát tiếp tục chuyển sang trường hợp tiếp theo.
YasharBahman

9
@YasharBahman, tôi nghĩ rằng có nhiều lỗi hơn các trường hợp dự định trong các ngôn ngữ hỗ trợ trường hợp rơi vào trường hợp. Trong C #, ngôn ngữ cho phép bạn goto case "SearchBooks";có khả năng thực hiện những gì bạn cần làm mà không mất nhiều biểu cảm hoặc thêm các lỗi không mong muốn.
đặc vụ-j

2
@ đại lý-j tôi thấy. Cảm ơn, điều đó rất có ý nghĩa. Ngoài ra, tôi không biết bạn có thể sử dụng goto như thế, điều đó thật tuyệt! (mặc dù, tôi nghĩ rằng tôi sẽ luôn mệt mỏi khi sử dụng nó vì các giáo sư của tôi đã thuyết phục tôi rằng tôi sẽ tự bốc cháy nếu tôi làm vậy)
YasharBahman

2
Tại sao đây không phải là một câu trả lời được chấp nhận? Nó cho biết thêm về những tùy chọn bạn có cho một câu lệnh chuyển đổi cộng với việc đưa ra câu trả lời cho câu hỏi.
Lập trình viên DotNet

30

Bạn có thể làm nhiều hơn là chỉ rơi vào C #, nhưng bạn phải sử dụng câu lệnh goto "đáng sợ". Ví dụ:

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

14

Bạn cần thêm một tuyên bố phá vỡ:

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

Điều này giả định rằng bạn muốn một trong hai tay cầm các SearchBookstrường hợp hoặc sự SearchAuthors- như bạn đã viết trong, trong một tuyên bố C-phong cách chuyển đổi truyền thống kiểm soát dòng chảy sẽ "rơi qua" từ một trường hợp tuyên bố ý nghĩa tiếp theo mà tất cả 4 dòng mã được thực hiện trong trường hợp searchType == "SearchBooks".

Lỗi trình biên dịch mà bạn đang thấy đã được giới thiệu (ít nhất là một phần) để cảnh báo người lập trình về lỗi tiềm ẩn này.

Để thay thế, bạn có thể đã ném một lỗi hoặc trả về từ một phương thức.


1
Có cách nào để sao chép công tắc giống C ở đây không? Chạy một số mã trong một chuyển đổi và sau đó chuyển sang một mã khác sẽ chạy cho tất cả mọi người?
John Demetriou

@JohnDemetriou Bạn có thể sử dụng các câu lệnh tình huống để sao chép giống nhau.
Itsme.cvk

4

Cuối mỗi trường hợp chuyển đổi, chỉ cần thêm câu lệnh break để giải quyết vấn đề như thế này-

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

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

            }

4

Vì nó không được đề cập trong các câu trả lời khác, tôi muốn nói thêm rằng nếu bạn muốn trường hợp SearchAuthors được thực thi ngay sau khi trường hợp đầu tiên được thực hiện, giống như trường hợp khi bỏ "ngắt" trong một số ngôn ngữ lập trình khác nơi được sắp xếp, bạn chỉ cần sử dụng "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

Bạn đã bỏ lỡ các câu lệnh break. Đừng quên nhập câu lệnh break ngay cả trong trường hợp mặc định.

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
Bạn nên đặt một số từ hoặc một cái gì đó để giải thích tại sao đây là một giải pháp. Vì bạn không giải thích lý do tại sao bạn cần nghỉ ngơi cho một số người chứ không phải những người khác.
Lập trình viên DotNet

3
ý bạn là "phụ âm"?
maksymiuk

1
1. Tôi nghĩ bạn có nghĩa là "nguyên âm" so với "bảng chữ cái". 2. Bạn có thể muốn thay đổi switch (ch)như sau. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Xin lỗi, đã phải. ;)
Tom
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.