5

The Nullable<T> type is defined as a struct. In .Net, you can't assign null to a struct because structs are value types that cannot be represented with null (with the exception of Nullable<T>).

int i = null; // won't compile - we all know this int? i = null; // will compile, and I'm glad it does, and it should compile, but why? 

How did Nullable<T> become an exception to the rule "You can't assign null to a value type?" The decompiled code for Nullable<T> offers no insights as of to how this happens.

1

1 Answer 1

15

How did Nullable<T> become an exception to the rule "You can't assign null to a value type?"

By changing the language, basically. The null literal went from being "a null reference" to "the null value of the relevant type".

At execution time, "the null value" for a nullable value type is a value where the HasValue property returns false. So this:

int? x = null; 

is equivalent to:

int? x = new int?(); 

It's worth separating the framework parts of Nullable<T> from the language and CLR aspects. In fact, the CLR itself doesn't need to know much about nullable value types - as far as I'm aware, the only important aspect is that the null value of a nullable value type is boxed to a null reference, and you can unbox a null reference to the null value of any nullable value type. Even that was only introduced just before .NET 2.0's final release.

The language support mostly consists of:

  • Syntactic sugar in the form of ? so int? is equivalent to Nullable<int>
  • Lifted operators
  • The changed meaning of null
  • The null-coalescing operator (??) - which isn't restricted to nullable value types
Sign up to request clarification or add additional context in comments.

13 Comments

@Dan: If you want lots more detail, I dedicate a whole chapter to nullable value types in C# in Depth :)
@JonSkeet So what would it take to make int i = null; equivalent to int i = new int();?
I suppose runtime will just set HasValue property to false when we set int i = null; Am I right @Jon
@Dan: It would take a new C# compiler, basically :)
@SriramSakthivel: It doesn't need to set it to false; that's the default value for the type, which is important for arrays etc. Basically there's a bool field inside the type.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.