我有一个场景,我们将数据合同文件属性自动生成为非可空的bool属性,如下所示。
public bool IsAlive { get; set;}
但是我试图分配一个可以为空的bool,因此编译器显示错误,因为无法从可空转换为非可空。
所以,我有两种方法可以解决这个错误,但只是好奇这两种方式有什么不同吗?因为即使我们没有将任何东西设置为bool,我也意识到两者都是默认值相同?
IsAlive = myDaddy.Status ?? false;
IsAlive = (bool)myDaddy.Status;
答案 0 :(得分:0)
状态可能是bool?
类型,不是bool
,而是Nullable<bool>
类型。
?
添加Nullable<Type>
的语法糖。
因此,您无法将它们显式转换为该类型,但您可以使用作为Value
泛型类的一部分的Nullable<>
方法。
这两种方法不同Nullable<bool>
因此编译器会对你大喊大叫,它无法将其转换为bool
类型。
您应该重构这些行,并假设有一种方法可以将这两个分配转换为bool
的结果或将IsAlive
变量更改为bool?
类型。
解决方案#1:
IsAlive = myDaddy.Status.GetValueOrDefault();
IsAlive = (myDaddy.Status.HasValue ? myDaddy.Status.Value : false);
解决方案#2:
public bool? IsAlive { get; set;}
答案 1 :(得分:0)
bool?
是使用Nullable<bool>
结构的Nullable<T>
的简写。请参阅文档here。
由于bool?
属于Nullable<T>
类型,因此它有两个有用的参数。 HasValue和Value。
您可以通过这种方式使用这些属性来设置具有适当值的常规布尔值。
bool? status = null;
bool isAlive;
if(status.HasValue)
{
//A value is set and can be True or False
isAlive = status.Value;
}
else
{
//Nullable bool has no value, there for bool value should be false.
isAlive = false;
}
所以你的代码可能看起来像这些:
IsAlive = myDaddy.Status.HasValue ? myDaddy.Status.Value : false;
或
if(myDaddy.Status.HasValue)
{
IsAlive = myDaddy.Status.Value;
}
else
{
IsAlive = false;
}