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

Ank*_*ain 39 .net c#

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

代码:

Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;
Run Code Online (Sandbox Code Playgroud)

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

Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;
Run Code Online (Sandbox Code Playgroud)

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

谢谢

小智 43

正如其他人所说bool?的不等于bool.bool?也可以null,见Nullable<t>(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;
Run Code Online (Sandbox Code Playgroud)


Nik*_*off 32

你已经声明IsCheckedbool?(Nullable<bool>).可以为空的布尔值可以是true,false或者null.现在问问自己:如果IsChecked为null,那么应该分配什么值IsDisplay(只能带一个true或者false)?答案是没有正确的答案.这里的隐式转换只会产生隐藏的麻烦,这就是设计者决定只允许显式转换而不是隐式转换的原因.

  • @intrepidis 这与问题或答案有什么关系? (3认同)

TyC*_*obb 13

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

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

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

obj.IsDisplay = (bool) chkDisplay.IsChecked;
Run Code Online (Sandbox Code Playgroud)


Shi*_*mmy 13

当我使用null check运算符时,我正面临着你的问题?.:

if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool
Run Code Online (Sandbox Code Playgroud)

所以我正在使用它

if (RolesList?.Any() != true)
  //value is null or false
Run Code Online (Sandbox Code Playgroud)

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

obj.IsDisplay = chkDisplay.IsChecked ?? false;
Run Code Online (Sandbox Code Playgroud)

  • 在确切的情况下得到了错误。阅读您的答案,我意识到“?”在幕后将标识符转换为可为空。很高兴知道,因为从现在开始,在不使用“if(obj != null)”之前我会三思而后行。 (2认同)

Vla*_*adL 6

布尔不等于布尔?

bool可以采取两个值,bool?bool

true可以拿三个,falsebool?

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


小智 5

您可以使用下面的代码来指定false何时IsCheckednull

obj.IsDisplay = chkDisplay.IsChecked == true;
Run Code Online (Sandbox Code Playgroud)