Kontrol tek bir vaka etiketinden geçemez


156

Hangi arama metin kutusu mevcut bağlı olarak arama alanında arama terimi yazacak bir anahtar deyimi yazmaya çalışıyorum. Takip koduna sahibim. Ancak "Denetim bir vaka etiketinden düşemez" hatası alıyorum.

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 bir vaka etiketinden ( case "SearchBooks":) diğerine geçemez

Kontrol bir vaka etiketinden ( case "SearchAuthors":) diğerine geçemez

Yanıtlar:


260

Orada bazı molaları kaçırdınız:

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

Onlar olmadan, derleyici aşağıdaki case "SearchAuthors":satırlar case "SearchBooks":yürütüldükten hemen sonra aşağıdaki satırları yürütmeye çalıştığınızı düşünüyor , bu C # 'da izin verilmiyor.

breakHer vakanın sonuna ifadeleri ekleyerek, program her durumdan sonra, hangi değerden olursa olsun çıkar searchType.


31
Benim için, bu koda bakarak oturdum ve nihayet bunu yararlı bulan herkes için, son davada mola kaçırdığımı fark edene kadar.
somoso

13
Ve ya benim çözümüm hayır gerektiriyorsa, breakçünkü bazı koşullardan geçmesi gerekiyor ?!
Siyah

10
vay, C # devs ne düşünüyordu ?! Bildiğim her programlama dilinde çalışıyor ancak C # dilinde çalışmıyor.
Siyah

8
Bu cevabın eksik olduğu şey, hala C-Style düşme işlemini kullanarak yapabilmenizdir goto case "some String".
NH.

3
Bunu hiç fark etmedim. Ben her zaman VB C ++ sahip durumda düşme özelliği eksik olduğunu düşündüm. Şimdi C # 'da olmadığını öğrendim ve VE yaralanmaya hakaret eklemek için break deyimini yazmanız gerekiyor. Hatta otomatik olarak doldurmaz.
Brain2000

138

İhtiyacınız için break;, throw, gotoveya returndavanız etiketleri her birinden. Bir döngüde de yapabilirsiniz 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;
        }

Bunun doğru olmadığı tek zaman, vaka etiketlerinin şu şekilde istiflenmesidir:

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

2
continueda mümkündür
Tobias Valinski

3
Herkes -neden- bunu açıklayabilir mi? Kod yürütmek için meşru kullanım durumları var gibi hissediyorum ve kontrol sonraki davaya düşmeye devam var.
YasharBahman

9
@YasharBahman, sanırım vakaların düşmesini destekleyen dillerde amaçlanan vakalardan çok daha fazla hata var. C # 'da dil, goto case "SearchBooks";çok fazla ifade kaybetmeden veya beklenmedik hatalar eklemeden yapman gereken şeyi yapabilmene izin verir .
agent-j

2
@ agent-j Anlıyorum. Teşekkürler, bu çok mantıklı. Ayrıca, böyle goto kullanabileceğinizi bilmiyordum, bu gerçekten harika! (her ne kadar, profesörlerim beni eğer yaparsam kendiliğinden
yanacağım

2
Bu neden kabul edilen cevap değil? Bir switch deyimi için hangi seçeneklere sahip olduğunuz ve artı soruya cevap veren hakkında daha fazla bilgi verir.
DotNet Programcı

30

Sadece C # düşmek daha fazlasını yapabilirsiniz, ancak "dreaded" goto deyimini kullanmanız gerekir. Örneğin:

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

14

Bir break ifadesi eklemeniz gerekir:

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

Bu ya sap istediğiniz varsayar SearchBooksdava veyaSearchAuthors - Kontrol akış sonraki anlamını bir vaka bildiriden "yoluyla düşmüş" olurdu geleneksel C tarzı anahtarı açıklamada, yazılı olduğu gibi o tüm kodu 4 satır durumda idam olun searchType == "SearchBooks".

Gördüğünüz derleyici hatası, programcıyı bu olası hata hakkında uyarmak için (en azından kısmen) tanıtıldı.

Alternatif olarak, bir hata atabilir veya bir yöntemden geri dönebilirsiniz.


1
Burada C benzeri anahtarı çoğaltmanın bir yolu var mı? Bir anahtarda bazı kodlar çalıştırın ve sonra herkes için çalışacak başka bir koda geçilsin mi?
John Demetriou

@JohnDemetriou Aynı çoğaltmak için go-case ifadelerini kullanabilirsiniz.
itsme.cvk

4

Her anahtar durumunun sonunda, bu sorunu bu şekilde çözmek için break ifadesini eklemeniz yeterlidir.

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

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

            }

4

Diğer cevaplarda belirtilmediğinden, ilk arama yapıldıktan hemen sonra vaka SearchAuthors'un yürütülmesini istiyorsanız, tıpkı diğer bazı programlama dillerinde "sonu" atlarken olduğu gibi eklemek istiyorum. bunun olduğu yerde, sadece "git" i kullanabilirsiniz.

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 ifadelerini kaçırdınız. Varsayılan durumda bile break ifadesi girmeyi unutmayın.

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
Bunun neden bir çözüm olduğunu açıklamak için bazı kelimeler veya başka şeyler yazmalısınız. Çünkü neden bazıları için değil, bazıları için molalara ihtiyacınız olduğunu açıklamıyorsunuz.
DotNet Programcı

3
"ünsüz" mu demek istediniz?
maksymiuk

1
1. Sanırım "sesli harf" ile "alfabe" demek istediniz. 2. switch (ch)Aşağıdakine değiştirmek isteyebilirsiniz . char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Üzgünüm, mecburdum. ;)
Tom
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.