Включить 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
.
Ответы
Ответ 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");
}