2016-01-22 14 views
9

Widzę dziwne zachowanie, gdy używam zerowej instrukcji wyłącznika w aktualizacji VS2015 1, której nie widzę w innych wersjach Visual Studio, gdzie działa zgodnie z oczekiwaniami.Nullable Długie oświadczenie przełącznika nie produkujące oczekiwanego wyjścia w VS2015

class Program 
{ 
    static void Main(string[] args) 
    { 
     NullableTest(-1); 
     NullableTest(0); 
     NullableTest(1); 
     NullableTest(2); 
     NullableTest(null); 
    } 

    public static void NullableTest(long? input) 
    { 
     string switch1; 
     switch (input) 
     { 
      case 0: 
       switch1 = "0"; 
       break; 
      case 1: 
       switch1 = "1"; 
       break; 
      default: 
       switch1 = "d"; 
       break; 
     } 

     string switch2; 
     switch (input) 
     { 
      case -1: 
       switch2 = "-1"; 
       break; 
      case 0: 
       switch2 = "0"; 
       break; 
      case 1: 
       switch2 = "1"; 
       break; 
      default: 
       switch2 = "d"; 
       break; 
     } 

     string ifElse; 
     if (input == 0) 
     { 
      ifElse = "0"; 
     } 
     else if (input == 1) 
     { 
      ifElse = "1"; 
     } 
     else 
     { 
      ifElse = "d"; 
     } 
     Console.WriteLine("Input = {0}, Switch 1 output = {1}, Switch 2 output = {2}, If Else = {3}", input, switch1, switch2, ifElse); 
    } 

Kod ten przykład daje następujący wynik (wyrównany dla czytelności):

Input = -1, Switch 1 output = d, Switch 2 output = d, If Else = d 
Input = 0, Switch 1 output = 0, Switch 2 output = d, If Else = 0 
Input = 1, Switch 1 output = d, Switch 2 output = d, If Else = 1 
Input = 2, Switch 1 output = d, Switch 2 output = d, If Else = d 
Input = , Switch 1 output = d, Switch 2 output = d, If Else = d 

Ja tylko obserwacji tego zachowania z pustych typów. Nielegalne typy działają zgodnie z oczekiwaniami.

pamiętać, że jest nie samo zachowanie, które jest w this question, i nie jest to spowodowane przez this kompilatora błędu, który został ustalony w VS2015 Aktualizacja 1. Mam sprawdzeniu, że oba te przykłady funkcjonować poprawnie.

Odpowiedz

2

Wygląda na to, że jest to spowodowane przez this bug i zostało naprawione za pomocą this pull request.

Próbowałem najnowszej wersji Roslyn, a przykładowy kod w pytaniu działa zgodnie z oczekiwaniami.

Here to zaktualizowana wersja narzędzia MSBuild Tools 2015, która rozwiązała problem.

1

To jest błąd. Uważam, że to musi być pozostawione z tego samego bug. Lepiej zamień swój kod na If, aby uniknąć nieoczekiwanego zachowania.