I love Eric Lipper, but he's just wrong here. This isn't SQL. He's treating null to mean "unknown", whereas it really means "nothing" (aka "absent" aka "missing value"). The opposite of an absent value is a present value (but an unknown one), which has no equivalent type in C#. (Or I guess you could say the opposite of "no value" is "every value".) Given those aren't options, the closest choice we have available is: true.
If you insist on treating null as "unknown" then you just destroy everything you know about the language. e.g., (null == x) and (null != x) would both have to always evaluate to null. Which is (thankfully) not how C# works.
Ehhh. I increasingly believe that implicit casts are a mistake. Therefore a null value is neither true nor false. Treating some pointer/referenced type variables holding a null value as a boolean is (or should be imho) a compile error.
If you want a bool then perform an equality operation or call a function. It’s slightly more verbose. But soooo much pain and suffering comes from implicit cast bullshit that I increasingly believe it is the way.
> Ehhh. I increasingly believe that implicit casts are a mistake.
I wasn't disagreeing with that part, just the part where he tries to justify it with "Treating null nullable Booleans as false leads to a number of oddities... neither Foo nor Bar is executed." That portion is not true, but that's fine - there are plenty of other reasons to avoid making null implicitly cast to bool.
For me, as a digital artist, the difference between null and zero often comes up. In the digital colour domain black = zero. However, for a designer/artist black is as active as white or any of the hues. In most digital colour spaces there is nothing that corresponds to null i.e. 'nothingness', i.e. transparency. For this, pre-multiplied alpha must be employed.
This is not new thinking. Goethe often spoke against the Newtonian understanding of black as an active presence (i.e. paint squeezed from a tube) rather than an absence of light.