2015-09-04 90 views
20

我認識到處理可空類型的正確方法是使用HasValue屬性。但我想知道爲什麼下面的switch語句在null情況下而不是默認情況下中斷。使用VS2015 C#4.0。另一臺使用VS2010 C#4.0的計算機沒有這個問題。打開可空布爾值:如果值爲真,則爲空

private void Testing() 
    { 
     bool? boolValue = true; 

     switch (boolValue) 
     { 
      case null: 
       break; //even though value is true, code runs here 

      default: 
       break; 
     } 
    } 

編輯:行爲與任何Nullable如果僅case Nulldefault指定觀察。

+0

我在VS2013上沒有得到這個行爲 –

+0

我猜你的符號是過時的,它不運行你認爲正在運行的東西,或者編譯器正在做一些奇怪的優化,並且把兩個相等的塊。也許在那裏添加一些實際的代碼,看看它有什麼作用。 –

+0

我在2010年沒有得到那種行爲。 – thewisegod

回答

5

這不是答案,我只是分享由VS2013和VS2015生成的IL代碼。

原始C#代碼:

public void Testing() 
{ 
    bool? boolValue = true; 

    switch (boolValue) 
    { 

     case null: 

      Console.WriteLine("null"); 

      break; 

     default: 
      Console.WriteLine("default"); 

      break; 
    } 
} 

VS2013 IL(反編譯):

public void Testing() 
{ 
    bool? boolValue = new bool?(true); 
    bool valueOrDefault = boolValue.GetValueOrDefault(); 
    if (boolValue.HasValue) 
    { 
     Console.WriteLine("default"); 
    } 
    else 
    { 
     Console.WriteLine("null"); 
    } 
} 

VS2015 IL(反編譯):

public void Testing() 
{ 
    bool? flag = new bool?(true); 
    bool? flag2 = flag; 
    bool? flag3 = flag2; 
    if (flag3.HasValue) 
    { 
     bool valueOrDefault = flag3.GetValueOrDefault(); 
    } 
    Console.WriteLine("null"); 
} 
+0

對我來說只有一個變量'nullable2'。沒有標誌1,2,3。但它似乎默認的部分根本不編譯。問題是所有可空類型 –

+0

也許它也取決於反編譯器。我正在使用ILSpy –

+0

但是爲什麼它會在VS2015中使用vendettamit? – MikeG

13

這將是非常短的答案:你剛剛擊中兩週前報道的Roslyn bug #4701

里程碑設置爲1.1,所以現在您需要在單獨的if子句中解決此問題,同時等待下一次編譯器更新。