The Collapse of Boolean Logic
What will this code write to the console?
public void SomeMethod()
{
SqlInt32 x = 1;
if(x == SqlInt32.Null)
{
Console.WriteLine("Null.");
}
else if(x != SqlInt32.Null)
{
Console.WriteLine("Not Null.");
}
else
{
Console.WriteLine("Neither? WTF!?");
}
}
If you said “Neither? WTF!?” then you’d be correct.
Doesn’t that seem odd since x is either SqlInt32.Null or it isn’t? Is
this a case of fuzzy logic? Well not exactly. This is one of those
gotchas with operator overloading. The == operator is overloaded by
SqlInt32 to return a SqlBoolean instead of a bool.
This caused me a few minutes of pain this week as I was stepping through code like this and examining the values in the debugger and I thought perhaps someone had slipped me a very strong hallucinogen because there I was with a value that was not null, but was null at the same time. It was one of those mind warping “This sentence is not true” moments.
As typical, I was thinking about rebooting when on a whim I decided to
use intermediate variables and realized that the == was returning
something neither true nor false. Honestly, I think this is a very poor
and unnecessary use of operator overloading (correct me if I’m wrong)
because it hides a real gotcha underneath a very common paradigm. If you
overload the == operator, you should most definitely return a bool.
In this case, it’s easy enough to fix. I should have been checking the
IsNull property anyways like so:
public void SomeMethod()
{
SqlInt32 x = 1;
if(x.IsNull)
{
Console.WriteLine("Null.");
}
else
{
Console.WriteLine("Not Null.");
}
}
This post by Cyrus motivated me to write about this.
Comments
3 responses