Error: 无法隐式将类型'bool?'转换为'bool'。存在显式转换(是否缺少强制转换?)
Code:
Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;
但是当我使用这种方法将属性转换为布尔值时,则不会出现错误。
Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;
我想知道为什么我需要将这个 bool 转换成 bool?
Error: 无法隐式将类型'bool?'转换为'bool'。存在显式转换(是否缺少强制转换?)
Code:
Test obj = new Test();
obj.IsDisplay = chkDisplay.IsChecked;
但是当我使用这种方法将属性转换为布尔值时,则不会出现错误。
Test obj = new Test();
obj.IsDisplay = (bool) chkDisplay.IsChecked;
我想知道为什么我需要将这个 bool 转换成 bool?
正如其他人所说,bool?
不等于 bool
。 bool?
也可以是 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;
您声明了IsChecked
为bool?
(Nullable<bool>
)。可空布尔值可以是true
、false
或null
。现在问问自己:如果IsChecked
为null,那么应该给IsDisplay
(只能取true
或false
)赋什么值呢?答案是没有正确的答案。这里的隐式转换只会产生隐藏的麻烦,这就是为什么设计者决定只允许显式转换而不是隐式转换的原因。
?.
时遇到了您的问题。if (!RolesList?.Any()) //Not accepted: cannot convert bool? to bool
所以我改用这个
if (RolesList?.Any() != true)
//value is null or false
在您的情况下,您应该这样设置:
obj.IsVisible = chkDisplayStuff.IsChecked ?? false;
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;
bool
不等于 bool?
。
bool
只能取两个值,true
和 false
。
bool?
则可以取三个值,true
、false
和 null
。
这就是它们不同的原因。
IsChecked
为null
时分配false
。obj.IsDisplay = chkDisplay.IsChecked == true;
chkDisplay.IsChecked
是bool?
类型,这意味着它可以保存true
、false
和null
三种值。然而,obj.IsDisplay
是bool
类型,只能保存true
或false
。
因此,您必须显式地将其转换为bool
类型。但是,如果您尝试将要转换为布尔值的值设为null
,仍会引发异常。
bool? nullableBool = null;
bool notNullableBool = (bool)nullableBool; //This will throw InvalidOperationException
试试这个
if (asset.IsUp ?? false)
将可空值转换为值类型
[HttpPost]
public ActionResult Index(bool? checkOffAge)
{
if (checkOffAge != null) {
model.CheckOffAge =(bool)checkOffAge;
}
}
bool check = chkDisplay.IsChecked ?? default(bool);
- intrepidistrue
还是false
...不确定为什么你觉得有必要挑剔,因为解释已经在那里了。 - Jeremy Lakeman