2016-01-22 87 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代替您的代码以避免任何意外的行为。