不能隐式转换类型’bool?’ ‘bool’。 存在显式转换(您是否错过了演员?)

错误:无法隐式转换类型’bool?’ ‘bool’。 存在显式转换(您是否错过了演员?)

代码:

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

但是当我使用这意味着施放在布尔然后没有错误。

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

我需要知道,为什么需要将这个bool转换为bool。

谢谢

你已经宣布IsCheckedbool?Nullable )。 可以为空的布尔值可以是truefalsenull 。 现在问问自己:如果IsChecked为null,那么应该为IsDisplay分配什么值(只能采用truefalse )? 答案是没有正确的答案。 这里的隐式转换只会产生隐藏的麻烦,这就是设计师决定只允许显式转换而不是隐式转换的原因。

正如其他人所说的bool? 不等于boolbool? 也可以为null ,请参阅Nullable ( msdn )。

如果你知道null状态想要暗示什么,你很容易就可以使用?? – null-coalescing operator( 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; 

bool? 不是bool 。 它实际上是Nullable http://msdn.microsoft.com/en-us/library/b3h38hb0(v=vs.110).aspx

如果你需要bool值那么你应该像你正在做的那样或者在bool?上调用.Value属性bool? 。 还有一个.HasValue属性,您可以检查以确保它不为null。

如果IsChecked为null,则此行将出错。

 obj.IsDisplay = (bool) chkDisplay.IsChecked; 

当我使用null check运算符时,我正在面对你的问题?.

 if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool 

所以我正在使用它

 if (RolesList?.Any() != true) //value is null or false 

在你的情况下,你应该这样设置:

 obj.IsDisplay = chkDisplay.IsChecked ?? false; 

布尔不等于布尔?

bool可以取两个值, truefalse

bool? 可以取三个, true falsenull

这就是他们与众不同的原因

您可以使用以下代码

 obj.IsDisplay = chkDisplay.IsChecked == true?true:false; 

chkDisplay.IsChecked的类型为bool? 。 这意味着它可以保存值truefalsenull 。 但是, obj.IsDisplay属于bool类型。 这意味着它只能是truefalse

因此,您必须明确地将其bool转换为bool类型。 但是,如果您尝试强制转换为bool的值为null ,则仍会抛出exception。

 bool? nullableBool = null; bool notNullableBool = (bool)nullableBool; //This will throw InvalidOperationException