Подтвердить что ты не робот

Включить Nullable Boolean: case переходит в null, когда значение true

Я понимаю, что правильный способ обработки типов с нулевым значением - использовать свойство HasValue. Но я хотел бы знать, почему следующий оператор switch разбивается на нулевой случай вместо значения по умолчанию. Использование VS2015 С# 4.0. Другой компьютер, использующий VS2010 С# 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 Null и default.

4b9b3361

Ответ 1

Это будет очень короткий ответ: вы просто нажали Roslyn bug # 4701, о котором сообщалось две недели назад.

Значок установлен в 1.1, поэтому прямо сейчас вам придется обходить это с помощью отдельного предложения if, ожидая следующего обновления компилятора.

Ответ 2

Это не ответ, я просто использую код IL, созданный VS2013 и VS2015.

Оригинальный код С#:

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");
}