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

Не может неявно преобразовать тип 'bool?' на "bool". Явное преобразование существует (вам не хватает роли?)

Ошибка: не может неявно преобразовать тип 'bool?' на "bool". Явное преобразование существует (вы пропускаете листинг?)

Код:

Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;

но когда я использую это средство, отличное от bool, тогда нет ошибки.

Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;

Мне нужно знать, зачем нужно отбрасывать этот bool для bool.

Спасибо

4b9b3361

Ответ 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