问题
I just came across this in a coworkers code. He has a nullable bool type that he compares like this:
//foo has no value here and evaluated to false
if(foo==true)
{
doSomething();
}
Typically, the way I check a nullable boolean is something like this:
bool IsTrue(bool? value)
{
return value.HasValue && value.Value;
}
if(IsTrue(foo)){
doSomething()
}
Edit: I ran through both methods and they both appear work the same way. I'm asking which one is the correct way and if the extra checks are necessary??
Now I am questioning both myself and my coworkers code. Is there any point in me doing this extra check here? Or can I safely do it the first way?
Thanks (and yes I did search for this! :))
回答1:
Actually I don't recommend you to treat null as false. Either use non-nullable boolean, or explicitly handle null value. One more option to do that:
if (foo ?? false)
{
}
回答2:
I'd use this.
bool IsTrue(bool? value)
{
return value.GetValueOrDefault();
}
This will return false when null or false and true only when it has a value and true.
Note: You cannot use bool? in if statement, as if statement requires anything which is implicitly convertible to Boolean. where as bool? is not convertible to boolean, so compiler will complain.
回答3:
You can simplify this by checking for the value to be true, like this:
bool IsTrue(bool? value)
{
return value == true;
}
This will work for nulls as well, returning false.
I prefer using this check "inline", without an additional function, because it is short and clean:
if(foo == true){
doSomething()
}
回答4:
since this doesnt compile
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
bool? test = null;
if (test)
{
Console.WriteLine("ok");
}
Console.ReadKey();
}
}
}
i would do something like
class Program
{
static void Main(string[] args)
{
bool? test = null;
if (test ?? false)
{
Console.WriteLine("ok");
}
Console.ReadKey();
}
}
but there is a million way of doing this so pick one and stick with it :-)
回答5:
You will have to check if the bool has value first.
I would do as you first proposed:
value.HasValue && value.Value
As it is most clear to people reading the code.
来源:https://stackoverflow.com/questions/20197275/nullable-bool-in-if-statement-checks-required