2016-05-28 1 views
2

Я пытаюсь преобразовать object в тип bool и хочу преобразовать bool и Nullable<bool>. Я также хочу убедиться, что я делаю соответствующие броски, где это возможно. Поэтому у меня есть следующий код:C# - оператор с нулевыми типами всегда ложный в соответствии с ReSharper

if (value is bool) 
{ 
    boolValue = (bool) value; 
} 
else if (value is bool? && ((bool?)value).HasValue) 
{ 
    boolValue = ((bool?) value).Value; 
} 
else 
{ 
    throw new ArgumentException("Value must be a boolean type"); 
} 

ReSharper +2016 сообщает мне, что value is bool? всегда будет оценивать ложь в этой стопке, если заявления. Почему это? Это означало бы, что Nullable<bool> не наследует от object (невозможно) или что value is bool захватит bool?.

Возможно также, что ReSharper 2016 имеет ошибку; Я вижу, что реализация System.Windows.Controls.BooleanToVisibilityConverter.Convert в значительной степени идентична. Я сомневаюсь, что в ядре WPF была бы такая ошибка, и я подумал, что это проблема с ReSharper.

ответ

6

Если тип значения хранится как object, это boxed. Бокс в Nullable<T> получает special treatment:

объектов на основе обнуляемых типов зажаты только если объект не равен нулю. Если HasValue является ложным, ссылка на объект присваивается нулевому значению вместо бокса ... Бокс с нулевым нулевым значением типа вводит в себя тип значения, а не System.Nullable, который обертывает тип значения.

И, согласно documentation for is:

Ап выражение истинно, если при условии, выражение ненулевым, и при условии, объект может быть приведен к предоставленному типа, не вызывая исключение.

Таким образом, используя оба из них можно вывести (см fiddle), что в нулевом случае:

bool? x = null; 
object obj = x; // assigns obj = null 
obj is bool?  // false, obj is null 
obj is bool  // false, obj is null 

И в ненулевым случае:

bool? x = true; 
object obj = x; // obj is boxed bool (true) 
obj is bool?  // true, obj unboxes to bool? 
obj is bool  // true, obj unboxes to bool 

Так ReSharper является правильно: ваша первая ветвь будет оцениваться как true, если value - true или false (был ли объект присвоен с bool или bool? не имеет значения или даже не известен). В этом случае вторая ветвь всегда будет false.

Смежные вопросы