无法隐式将'type 'bool?'转换为'bool'。存在显式转换(是否遗漏了一次类型转换?)

72

Error: 无法隐式将类型'bool?'转换为'bool'。存在显式转换(是否缺少强制转换?)

Code:

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

但是当我使用这种方法将属性转换为布尔值时,则不会出现错误。

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

我想知道为什么我需要将这个 bool 转换成 bool?

10个回答

76

正如其他人所说,bool? 不等于 boolbool? 也可以是 null,请参见 Nullable<t> (msdn)。

如果你知道 null 状态要表达的意思,你可以轻松使用 ?? - null 合并操作符 (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;

注意:语句“使用 ?? - null-coalescing 运算符...将您的 bool? 转换为 bool,没有任何副作用”是不正确的 - 副作用是您正在用 false 替换 null。您也可以使用 ?? true 将 null 替换为 true - 在这里要小心!bool? 具有三态逻辑(null、true、false),而 bool 只有两个状态(true、false)。 - Matt
如果你想要真的挑剔一点,你可以这样写: bool check = chkDisplay.IsChecked ?? default(bool); - intrepidis
1
如果你知道 null 状态想要表达什么,那么你就知道你需要 true 还是 false...不确定为什么你觉得有必要挑剔,因为解释已经在那里了。 - Jeremy Lakeman

47

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


34
我在使用空值检查操作符?.时遇到了您的问题。
if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool

所以我改用这个

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

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

obj.IsVisible = chkDisplayStuff.IsChecked ?? false;

17

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

如果你需要bool值,那么你应该像你正在做的那样进行强制转换或者调用bool?.Value属性。此外还有一个.HasValue属性,您可以检查以确保其不为null。

如果IsChecked为null,则该行代码会报错。

obj.IsDisplay = (bool) chkDisplay.IsChecked;

6

bool 不等于 bool?

bool 只能取两个值,truefalse

bool? 则可以取三个值,truefalsenull

这就是它们不同的原因。


5
您可以使用以下代码,在IsCheckednull时分配false
obj.IsDisplay = chkDisplay.IsChecked == true;

3

chkDisplay.IsCheckedbool?类型,这意味着它可以保存truefalsenull三种值。然而,obj.IsDisplaybool类型,只能保存truefalse

因此,您必须显式地将其转换为bool类型。但是,如果您尝试将要转换为布尔值的值设为null,仍会引发异常。

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

2

试试这个

if (asset.IsUp ?? false)

0
只需在您的if条件中添加"== true/false"即可。

欢迎来到Stack Overflow!感谢您的回答。请提供更多关于您解决方案的细节。代码片段、高质量的描述或任何相关信息都会很好。对于每个人来说,清晰简明的答案更有帮助和易于理解。请通过编辑您的答案,提供具体细节以提高答案的质量。欲了解更多信息,请参阅如何:撰写好的答案。祝您编码愉快! - undefined

0

将可空值转换为值类型

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接