UPDATE: This question was the subject of my blog in July 2013. Thanks for the great question!
J. Commer's answer is correct (and good for them to do what, obviously, there was a lot of speculation!), But I thought I would add a bit of historical perspective.
When Mads and I sorted out the exact wording of the various parts of the specification for C # 3.0, we realized that the "null type" was strange. This is a "type" with a single value. This is the "type" of which "Reflection" knows nothing. This is a “type” that does not have a name that GetType never returns, which you cannot specify as the type of a local variable or field or anything else. In short, it really is a “type” that should only make the type system “complete”, so that every compile-time expression has a type.
Except that C # already had expressions that did not have types: method groups in C # 1.0, anonymous methods in C # 2.0, and lambdas in C # 3.0 are not type. If all these things cannot have any type, we realized that the “null” should not have a type either. Therefore, we removed references to the useless "null type" in C # 3.0.
As part of the implementation, Microsoft implementations from C 1.0 through 5.0 all have an internal object to represent the "null type". They also have objects to represent non-existent lambda types, anonymous methods, and method groups. This choice of implementation has a number of pros and cons. On the pro side, the compiler can query the type of expression and get a response. On the other hand, this means that sometimes errors in the analysis of types that the compiler really should have broken instead cause semantic changes in programs. My favorite example of this is that in C # 2.0 you can use the invalid expression "null? Null"; due to an error, the compiler cannot mark this as an erroneous use of the operator ?? , and then concludes that the type of this expression is a "null type", although it is not a null literal. This then leads to many other errors in the stream as the type analyzer tries to understand the type.
At Roslyn, we probably won't use this strategy; rather, we just baked into the compiler implementation that some expressions are not of type.
Eric Lippert Nov 21 '11 at 16:50 2011-11-21 16:50
source share