开启Nullable布尔值:当值为true时,case转到null

Mik*_*keG 20 c# visual-studio-2015

我意识到处理可空类型的正确方法是使用HasValue属性.但我想知道为什么以下switch语句在null case而不是default上打破.使用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

编辑:使用任何Nullableif仅指定行为,case Null并且default指定行为.

Luc*_*ski 13

这将是一个非常简短的答案:你刚刚在两周前报道了Roslyn bug#4701.

里程碑设置为1.1,所以现在您必须使用单独的if子句解决此问题,同时等待下一次编译器更新.


Yac*_*sad 5

这不是答案,我只是分享由VS2013和VS2015生成的IL代码.

原始C#代码:

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

    switch (boolValue)
    {

        case null:

            Console.WriteLine("null");

            break; 

        default:
            Console.WriteLine("default");

            break;
    }
}
Run Code Online (Sandbox Code Playgroud)

VS2013 IL(反编译):

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

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");
}
Run Code Online (Sandbox Code Playgroud)