C# 可空布尔的编译器错误

C# 可空布尔的编译器错误,c#,C#,它正在生成异常 无法将类型“bool”隐式转换为“bool”。明确的 存在转换(您是否缺少演员阵容?) 我做错了什么? 感谢您的支持和考虑。这是不允许的,因为不清楚null在条件语句上下文中的含义 可空布尔值可以显式转换为布尔值,以便在条件中使用,但如果对象的值为null,则将抛出InvalidOperationException 因此,在转换到bool之前检查HasValue属性非常重要 像 bool? ispurchased = null; var pospurcahsed= is

它正在生成异常

无法将类型“bool”隐式转换为“bool”。明确的 存在转换(您是否缺少演员阵容?)

我做错了什么?
感谢您的支持和考虑。

这是不允许的,因为不清楚null在条件语句上下文中的含义

可空布尔值
可以显式转换为
布尔值
,以便在条件中使用,但如果对象的值为null,则将抛出
InvalidOperationException

因此,在转换到
bool
之前检查HasValue属性非常重要

 bool? ispurchased = null;
    var pospurcahsed= ispurchased ? "1":"2";
可空布尔值类似于SQL中使用的布尔变量类型。为确保&和|运算符生成的结果与SQL的三值布尔类型一致,提供了以下预定义运算符:

   var pospurcahsed=  (ispurchased.HasValue && ispurchased.Value) ?......

或者您可以使用
martin
建议
GetValueOrDefault
[感谢martin指出]


即使
HasValue
属性为false(与引发异常的value属性不同),getValuerDefault方法也会返回一个值

您遇到的问题是条件运算符
?:要求的是
bool
,而不是
bool?
。您可以将其强制转换并完成,但如果该值包含一个
null
,则会得到一个
invalidoOperationException
,因此您可能应该首先检查该值

给定变量的名称,我假设您希望像对待
false
一样对待
null
,因此在下面的代码中,我检查它是否有值,如果它有值,那么它将在条件中使用它。如果它没有值(即
null
),则不会发生强制转换,也不会出现错误(表达式的计算结果将为false)


您不能在条件中直接使用
Nullable
bool?
,而是像以下那样使用它:

bool? ispurchased = null;
var pospurcahsed = (ispurchased.HasValue && (bool)ispurchased) ? "1":"2";

您应该使用.value

var pospurcahsed= (ispurchased.HasValue && ispurchased.Value) ? "1":"2";

你可以用这样的东西

bool? ispurchased = null;

if (ispurchased.HasValue)
{
    var pospurcahsed = ispurchased.Value ? "1" : "2";
}
我建议不要对已知类型使用
var
关键字

而不是像这样使用:

 bool? chk = false; 

 //or

 bool? chk2 = false;

 var test = (chk != null && (bool)chk) ? "1": "2";

 //or

 var test2 = (chk2.HasValue && (bool)chk2) ? "1" : "2";

这不是我得到的错误消息,我的错误消息是,
无法将类型“bool”隐式转换为“bool”。存在显式转换(是否缺少强制转换?)1
@George Duckett很抱歉输入错误。
ispurchased.HasValue&&ispurchased.Value
可以重新编写为
ispurchased==true
,这在我看来更具可读性。或者作为
ispurchased.GetValueOrDefault()
@hvd不会
isPurchased==true
抛出空值?@Tejas-否。比较
bool
bool?
doh很好。这很有意义。谢谢
 bool? chk = false; 

 //or

 bool? chk2 = false;

 var test = (chk != null && (bool)chk) ? "1": "2";

 //or

 var test2 = (chk2.HasValue && (bool)chk2) ? "1" : "2";
String test = (chk != null && (bool)chk) ? "1" : "2";