Why doesn't bool? support lifted && and ||? They could have lifted the true and false operators which would have indirectly added lifted && and ||.
The operators | and & are already lifted and implement the correct Three-valued logic. But of course they are not short circuiting like || and &&.
The question is why they decided not to lift those operators when creating the specification. So "It's like this because the spec says so" is no answer to the "why?".
When lifting true and false so that null is neither true nor false:
public static bool operator true(bool? x)
{
return x.HasValue && x.Value
}
public static bool operator false(bool? x)
{
return x.HasValue && !x.Value
}
This would have resulted in && and || behaving just like their non short-circuiting counterparts. Except that false && anything and true || anything would short circuit (false and true are no compile time constants in these two examples).
This would work very similar to the DBBool example on MSDN.
I see no surprising or dangerous behavior introduced by lifting these operators. Did I miss something?
I have read another SO question on this, but found none of the answers satisfying.
Jeff Yates's answer shows a nice reason for why lifting the true/false operators isn't optimal, it doesn't explain why lifting && and || directly is bad. Since operator lifting is compiler magic that special cases Nullable<T> it doesn't need to follow the overloading rules for normal types and thus would be able to offer &&/|| without lifting true.