转换bool?分配给布尔

时间:2015-12-04 00:25:57

标签: c# .net c#-4.0 nullable

我有一个场景,我们将数据合同文件属性自动生成为非可空的bool属性,如下所示。

public bool IsAlive { get; set;}

但是我试图分配一个可以为空的bool,因此编译器显示错误,因为无法从可空转换为非可空。

所以,我有两种方法可以解决这个错误,但只是好奇这两种方式有什么不同吗?因为即使我们没有将任何东西设置为bool,我也意识到两者都是默认值相同?

IsAlive = myDaddy.Status ?? false;
IsAlive = (bool)myDaddy.Status;

2 个答案:

答案 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;
}