Не может неявно преобразовать тип 'bool?' на "bool". Явное преобразование существует (вам не хватает роли?)
Ошибка: не может неявно преобразовать тип 'bool?' на "bool". Явное преобразование существует (вы пропускаете листинг?)
Код:
Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;
но когда я использую это средство, отличное от bool, тогда нет ошибки.
Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;
Мне нужно знать, зачем нужно отбрасывать этот bool для bool.
Спасибо
Ответы
Ответ 1
Вы объявили IsChecked
как bool?
(Nullable<bool>
). Нулевым булевым может быть либо true
, false
, либо null
. Теперь спросите себя: если IsChecked
было null, то какое значение должно быть присвоено IsDisplay
(которое может принимать только true
или false
)? Ответ в том, что правильного ответа нет. Неявный бросок здесь может вызвать только скрытые проблемы, поэтому дизайнеры решили разрешить явное преобразование, а не неявное.
Ответ 2
Как утверждали другие bool?
, не равно bool
. bool?
также может быть null
, см. Nullable<t>
(msdn).
Если вы знаете, что означает состояние null
, вы легко можете использовать - оператор null-coalescing (msdn), чтобы преобразовать bool?
в bool
без каких-либо побочных эффектов (Exception
).
Пример:
//Let´s say "chkDisplay.IsChecked = null" has the same meaning as "chkDisplay.IsChecked = false" for you
//Let "check" be the value of "chkDisplay.IsChecked", unless "chkDisplay.IsChecked" is null, in which case "check = false"
bool check = chkDisplay.IsChecked ?? false;
Ответ 3
bool?
не является bool
. На самом деле это Nullable<bool>
http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx
Если вам нужно значение bool
, то вы должны либо сбрасывать, как и вы, или называть свойство .Value
на bool?
. Существует также свойство .HasValue
, которое вы можете проверить, чтобы убедиться, что оно не равно null.
Если IsChecked
имеет значение null, эта строка будет ошибочной.
obj.IsDisplay = (bool) chkDisplay.IsChecked;
Ответ 4
bool не равно bool?
bool
может принимать два значения: true
и false
bool?
может принимать три, true false
и null
Вот почему они разные
Ответ 5
Я столкнулся с вашим вопросом, когда я использую оператор нулевой проверки ?.
:
if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool
Поэтому я использую это вместо
if (RolesList?.Any() != true)
//value is null or false
В вашем случае вы должны установить его так:
obj.IsDisplay = chkDisplay.IsChecked ?? false;
Ответ 6
Вы можете использовать ниже код
obj.IsDisplay = chkDisplay.IsChecked == true?true:false;
Ответ 7
chkDisplay.IsChecked
имеет тип bool?
. Это означает, что он может содержать значения true
, false
и null
.
Однако obj.IsDisplay
имеет тип bool
. Это означает, что он может удерживать только true
или false
.
Следовательно, вы должны явно наложить его на тип bool
. Однако это все равно вызовет исключение, если значение, которое вы пытаетесь использовать для bool, равно null
.
bool? nullableBool = null;
bool notNullableBool = (bool)nullableBool; //This will throw InvalidOperationException