2016-01-22 38 views
9

在VS2015 Update 1中使用可空的長開關語句時,我看到一些奇怪的行爲,在其他Visual Studio版本中沒有看到它按預期方式運行。可空的長開關語句在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); 
    } 

此示例代碼產生以下輸出(對準,用於可讀性):

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 

我只觀察與空類型此行爲。不可空值類型按預期工作。

注意,這是相同的行爲是在this question,而不是由一個已經固定在VS2015更新1.我驗證過兩個那些例子正確運行this編譯器故障而引起的。

回答

2

看起來這是由this bug造成的,並且使用this pull request修復。

我已經嘗試了最近版本的羅斯林和示例代碼中的問題如預期現在工作。

Here是已更正此問題的MSBuild Tools 2015的更新版本。

1

這是一個錯誤。我相信它必須是相同的bug。您最好用If代替您的代碼以避免任何意外的行爲。