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

时间:2014-03-27 06:57:47

标签: c# .net

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

代码:

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

但是当我使用这意味着在bool中施放时,则没有错误。

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

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

由于

9 个答案:

答案 0 :(得分:39)

正如其他人所说bool?不等于boolbool?也可以是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;

答案 1 :(得分:26)

您已将IsChecked声明为bool?Nullable<bool>)。可以为空的布尔值可以是truefalsenull。现在问问自己:如果IsChecked为空,那么应该将哪个值分配给IsDisplay(只能使用truefalse)?答案是没有正确的答案。这里的隐式转换只会产生隐藏的麻烦,这就是设计师决定只允许显式转换而不是隐式转换的原因。

答案 2 :(得分:11)

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

如果您需要bool值,那么您应该按照自己的方式进行投射,或者调用.Value上的bool?属性。还有一个.HasValue属性,您可以检查以确保它不为空。

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

obj.IsDisplay = (bool) chkDisplay.IsChecked;

答案 3 :(得分:9)

当我使用空检查操作符?.时,我正在面对您的问题:

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

所以我改用

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

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

obj.IsDisplay = chkDisplay.IsChecked ?? false;

答案 4 :(得分:5)

bool不等于bool?

bool可以使用两个值,truefalse

bool?可以取三个,true falsenull

这就是他们不同的原因

答案 5 :(得分:3)

您可以使用以下代码

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

答案 6 :(得分:1)

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

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

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

答案 7 :(得分:0)

将可为空的值转换为值类型

[HttpPost]
public ActionResult Index(bool? checkOffAge)
{
    if (checkOffAge != null) {
       model.CheckOffAge =(bool)checkOffAge;
    }
}

答案 8 :(得分:0)

尝试

if (asset.IsUp ?? false)