การควบคุมไม่สามารถผ่านได้จากฉลากเคสเดียว


156

ฉันพยายามเขียนคำสั่ง 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":) ไปยังอีกฉลาก

คำตอบ:


260

คุณพลาดการพักที่นั่น:

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 #

โดยการเพิ่มงบในตอนท้ายของแต่ละกรณีที่ออกจากโปรแกรมแต่ละกรณีหลังจากที่ทำสำหรับแล้วแต่จำนวนใดค่าของbreaksearchType


31
สำหรับฉันฉันนั่งอยู่ที่นั่นดูรหัสนี้และของฉันเองจนในที่สุดฉันก็รู้ว่าฉันหายไปจริง ๆ ในกรณีสุดท้ายสำหรับทุกคนที่พบว่ามีประโยชน์
somoso

13
และถ้าโซลูชันของฉันไม่ต้องการbreakเพราะต้องผ่านในบางสถานการณ์!
Black

10
ว้าวววห่า C # devs กำลังคิดอะไรอยู่! มันใช้งานได้ในทุกภาษาที่ฉันรู้จัก แต่ไม่ใช่ใน C #
Black

8
สิ่งหนึ่งที่คำตอบนี้หายไปคือความจริงที่ว่าคุณยังสามารถใช้ C-Style fall-throughs goto case "some String"ได้
นิวแฮมป์เชียร์

3
ฉันไม่เคยตระหนักถึงสิ่งนี้ ฉันมักจะคิดว่า VB หายไปคุณสมบัติตัวพิมพ์เล็กที่ C ++ มี ตอนนี้ฉันพบว่า C # ไม่มีทั้งและเพื่อเพิ่มการดูถูกการบาดเจ็บคุณต้องพิมพ์คำสั่งทำลาย มันจะไม่ป้อนอัตโนมัติอีกด้วย
Brain2000

138

คุณจำเป็นต้อง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;

2
continueเป็นไปได้เช่นกัน
Tobias Valinski

3
ทุกคนสามารถอธิบายได้ - ทำไม - นี่คือ? ฉันรู้สึกว่ามีกรณีการใช้งานที่ถูกต้องตามกฎหมายในการเรียกใช้รหัสและควบคุมได้อย่างต่อเนื่อง
YasharBahman

9
@YasharBahman ฉันคิดว่ามีข้อบกพร่องมากกว่ากรณีที่ตั้งใจในภาษาที่สนับสนุนกรณีล้มเหลว ใน C # ภาษาช่วยgoto case "SearchBooks";ให้คุณมีความสามารถในการทำสิ่งที่คุณต้องทำโดยไม่สูญเสียการแสดงออกหรือเพิ่มข้อผิดพลาดที่ไม่คาดคิด
agent-j

2
@ agent-j ฉันเห็น ขอบคุณที่ทำให้รู้สึกมาก นอกจากนี้ฉันไม่รู้ว่าคุณสามารถใช้ goto แบบนั้นมันยอดเยี่ยมจริงๆ! (แม้ว่าฉันคิดว่าฉันจะเหนื่อยกับการใช้มันเสมอเพราะอาจารย์ของฉันทำให้ฉันเชื่อว่าฉันจะเผาเองถ้าฉันทำ)
YasharBahman

2
ทำไมคำตอบนี้จึงไม่เป็นที่ยอมรับ มันบอกเพิ่มเติมเกี่ยวกับตัวเลือกที่คุณมีสำหรับคำสั่ง switch และให้คำตอบกับคำถาม
โปรแกรมเมอร์ DotNet

30

คุณสามารถทำได้มากกว่าเพียงแค่ตกอยู่ใน C # แต่คุณต้องใช้คำสั่ง goto ที่ "หวั่น" ตัวอย่างเช่น:

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

14

คุณต้องเพิ่มคำสั่ง 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"ได้รับการดำเนินการในกรณีที่

ข้อผิดพลาดของคอมไพเลอร์ที่คุณเห็นถูกแนะนำ (อย่างน้อยก็บางส่วน) เพื่อเตือนโปรแกรมเมอร์ของข้อผิดพลาดที่อาจเกิดขึ้นนี้

เป็นทางเลือกคุณอาจมีข้อผิดพลาดหรือส่งคืนจากวิธีการ


1
มีวิธีการทำซ้ำสวิตช์ C เหมือนที่นี่หรือไม่? เรียกใช้โค้ดบางอย่างในสวิตช์หนึ่งแล้วตกไปอีกอันที่จะทำงานให้ทุกคน?
John Demetriou

@JohnDemetriou คุณสามารถใช้คำสั่ง go to case เพื่อทำซ้ำแบบเดียวกัน
itsme.cvk

4

ในตอนท้ายของแต่ละกรณีสวิตช์เพียงเพิ่มคำสั่ง break เพื่อแก้ไขปัญหานี้เช่นนี้ -

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

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

            }

4

เนื่องจากมันไม่ได้กล่าวถึงในคำตอบอื่น ๆ ฉันต้องการเพิ่มว่าถ้าคุณต้องการให้กรณี SearchAuthors ถูกดำเนินการหลังจากกรณีแรกเสร็จสิ้นเหมือนกับกรณีเมื่อละเว้นการ "หยุด" ในภาษาโปรแกรมอื่น คุณสามารถใช้ "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

คุณพลาดคำสั่ง 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;

}

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
คุณควรใส่บางคำหรือบางสิ่งเพื่ออธิบายว่าทำไมการแก้ปัญหานี้ เนื่องจากคุณไม่ได้อธิบายว่าทำไมคุณถึงต้องการหยุดพักสำหรับบางคนและไม่ใช่คนอื่น
โปรแกรมเมอร์ DotNet

3
หมายถึง "พยัญชนะ"
maksymiuk

1
1. ฉันคิดว่าคุณหมายถึง "สระ" กับ "ตัวอักษร" 2. คุณอาจต้องการเปลี่ยนswitch (ch)เป็นสิ่งต่อไปนี้ char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)ต้องขออภัยด้วย ;)
ทอม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.