Nullable Bool的编译器错误

时间:2013-05-09 06:46:13

标签: c#

 bool? ispurchased = null;
    var pospurcahsed= ispurchased ? "1":"2";

它产生例外。

  

无法隐式转换类型'bool?' 'bool'。一个明确的   存在转换(你错过了演员吗?)

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

5 个答案:

答案 0 :(得分:7)

这是不允许的,因为不清楚null在条件的上下文中意味着什么。

Nullable Booleans可以显式转换为bool以便在条件中使用,但如果对象的值为null,则会抛出InvalidOperationException

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

使用

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

Nullable Booleans类似于SQL中使用的布尔变量类型。确保&和|运算符与SQL的三值布尔类型一致,提供了以下预定义运算符:

bool? operator &(bool? x, bool? y)

bool? operator |(bool? x, bool? y)

enter image description here

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

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

答案 1 :(得分:2)

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

鉴于您的变量的名称,我已经开始并假设您要像null那样对待false,所以在下面的代码中我会检查以确保它有一个值,如果确实如此,它将在条件中使用它。如果它没有值(即它是null,则转换将永远不会发生并且您将不会得到错误(表达式将评估为false)。

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

答案 2 :(得分:2)

您应该使用 .value

bool? ispurchased = null;

if (ispurchased.HasValue)
{
    var pospurcahsed = ispurchased.Value ? "1" : "2";
}

答案 3 :(得分:1)

您无法直接在条件中使用Nullable<bool>bool?,而是使用它:

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

答案 4 :(得分:0)

你可以使用这样的东西

 bool? chk = false; 

 //or

 bool? chk2 = false;

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

 //or

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

我建议不要对已知类型使用var关键字。

而不是这样使用像这样:

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