2011-09-29 10 views
24

Mój kod wygląda następująco:sprawa przełącznika w C# - oczekiwana wartość stałą jest

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    switch (dataSourceName) 
    { 
     case (string)typeof(CustomerDetails).Name.ToString(); : 
      var t = 123; 
      break; 
     default: 
      Console.WriteLine("Test"); 
    } 
} 

Ale to nie działa. Oświadczenie case daje mi błąd mówiący, że oczekiwana jest stała zmienna. Proszę, pomóżcie chłopcom, dziękuję!

+0

możliwy duplikat [C# - Czy jest jakaś lepsza alternatywa dla "włączania typu"?] (Http://stackoverflow.com/questions/298976/c-is-there-a-better-alternative-than ten typ przełącznika) –

Odpowiedz

20

Zobacz C# switch statement limitations - why?

Zasadniczo przełączniki nie mogą być oceniane oświadczenia w instrukcji case. Muszą być ocenione statycznie.

+1

To nie jest prawda w VB.net ... Próbuję przekonwertować kod, który już ma tego rodzaju wartości (w zasadzie wywołania metod) –

+3

@Moslem Ben Dhaou tak C# Przełącznik zdecydowanie nie jest równoważny z oświadczeniem VB Case. W przypadku instrukcji Case można używać wyrażeń (wywołań funkcji, zmiennych itp.), Podczas gdy C# wymaga stałych wartości (bez wywołań funkcji, zmiennych itd.). Instrukcja switch jest dość ograniczona porównywalnie. – deepee1

19

Można dopasować tylko do stałych w instrukcjach przełączania.

Przykład:

switch (variable) 
{ 
    case 0: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

działa, ale

switch (variable) 
{ 
    case sameothervarialbe: 
     //Code 
     break; 
    default: 
     //Code 
     break; 
} 

nie

+11

Jako dodatkowa uwaga: "const int myConstant = 3" liczy się jako stała, ale "tylko do odczytu statycznego int myReadonlyStatic = 3" nie ma. – statue

1

przełącznik jest bardzo wybredna w tym sensie, że wartości w przełączniku musi być kompilacji stałą czasową. a także porównywana wartość musi być pierwotna (lub ciąg). W tym celu powinieneś użyć instrukcji if.

Powód może się cofać do sposobu, w jaki C obsługuje je, ponieważ tworzy tabelę skoków (ponieważ wartości są kompilowanymi stałymi czasowymi) i próbuje skopiować tę samą semantykę, nie zezwalając na wartości w twoich przypadkach.

3

Johnnie, przejdź przez przewodnik msdn pod numerem switch. Również specyfikacja # język C jasno określa kompilacji przypadek błędu Czas:

• Jeśli typ ekspresji przełącznika jest sbyte, byte, short, ushort, int, uint, długie, Ulong, bool, char, ciąg znaków lub typ wyliczeniowy lub jeśli jest to typ zerowalny odpowiadający jednemu z tych typów, wówczas jest to typ rządzący instrukcją switch.

• W przeciwnym razie dokładnie zdefiniowany przez użytkownika niejawna konwersja (§6.4) musi istnieje od rodzaju ekspresji przełączyć się na jeden z następujących możliwych typów regulujących: sbyte, byte, short, int, ushort, uint długi, ulong, char, string lub, typ nullla odpowiadający jednemu z tych typów.

• W przeciwnym razie, jeśli nie istnieje taka niejawna konwersja lub jeśli istnieje więcej niż jedna niejawna konwersja, występuje błąd podczas kompilacji.

Mam nadzieję, że to pomoże.

3

Nie można użyć do tego instrukcji switch, ponieważ wartości nie mogą być wartościowane. W tym celu należy użyć znaku a, jeśli/inaczej ...

public static void Output<T>(IEnumerable<T> dataSource) where T : class 
{ 
    dataSourceName = (typeof(T).Name); 
    if(string.Compare(dataSourceName, typeof(CustomerDetails).Name.ToString(), true)==0) 
    { 
     var t = 123; 
    } 
    else if (/*case 2 conditional*/) 
    { 
     //blah 
    } 
    else 
    { 
     //default case 
     Console.WriteLine("Test"); 
    } 
} 

Ja również skorzystałem z możliwości uporządkowania oświadczenia warunkowego. Po wywołaniu ToString() nie trzeba przesyłać na ciąg. To zawsze i tak zwróci ciąg znaków. Porównując łańcuchy równości, należy pamiętać, że użycie operatora == spowoduje porównanie wielkości liter.Lepiej używać porównania string = 0 z ostatnim argumentem do włączania/wyłączania wielkości liter.

Powiązane problemy