C# 打开可为null的布尔值:当值为true时,大小写变为null

C# 打开可为null的布尔值:当值为true时,大小写变为null,c#,visual-studio-2015,C#,Visual Studio 2015,我意识到处理可空类型的正确方法是使用HasValue属性。但是我想知道为什么下面的switch语句在null情况下而不是缺省情况下中断。使用VS2015 C#4.0。另一台使用VS2010 C#4.0的计算机没有同样的问题 private void Testing() { bool? boolValue = true; switch (boolValue) { case null:

我意识到处理可空类型的正确方法是使用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;
        }
    }

编辑:如果只指定了
案例空
默认
,则任何
可空的
都会观察到行为。

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

原始C#代码:

VS2013 IL(反编译):

VS2015 IL(反编译):


这将是一个非常简短的回答:你刚刚击中,两周前报道


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

我在VS2013上没有看到这种行为,我猜您的符号已经过时,并且没有运行您认为正在运行的代码,或者编译器正在做一些奇怪的优化工作,并将两个相等的块组合在一起。也许在那里添加一些实际的代码,看看它能做什么。我在2010年没有看到这种行为。你是在看调试器告诉你的,还是在这两种情况下你也看到了实际不同的代码?你检查过IL了吗?(使用ildasm?)对我来说只有一个变量
nullable2
。不是flag1,2,3。但默认部分似乎根本不编译。问题是对于所有可为空的类型,它也可能取决于反编译器。我使用的是ILSPI版本14.0.23107.0 D14REL,你们有@vendettamit的哪个版本?
public void Testing()
{
    bool? boolValue = true;

    switch (boolValue)
    {

        case null:

            Console.WriteLine("null");

            break; 

        default:
            Console.WriteLine("default");

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