What is the default value of the nullable type "int?" (including question mark)?

C#IntegerNullable

C# Problem Overview


In C#, what is the default value of a class instance variable of type int??

For example, in the following code, what value will MyNullableInt have if it is never explicitly assigned?

class MyClass
{
    public int? MyNullableInt;
}

(It seems likely that the answer is almost certainly either null or 0, but which of those is it?)

C# Solutions


Solution 1 - C#

The default value for int? -- and for any nullable type that uses the "type?" declaration -- is null.

Why this is the case:

  • int? is syntactic sugar for the type Nullable<T> (where T is int), a struct. (reference)
  • The Nullable<T> type has a bool HasValue member, which when false, makes the Nullable<T> instance "act like" a null value. In particular, the Nullable<T>.Equals method is overridden to return true when a Nullable<T> with HasValue == false is compared with an actual null value.
  • From the C# Language Specification 11.3.4, a struct instance's initial default value is all of that struct's value type fields set to their default value, and all of that struct's reference type fields set to null.
  • The default value of a bool variable in C# is false (reference). Therefore, the HasValue property of a default Nullable<T> instance is false; which in turn makes that Nullable<T> instance itself act like null.

Solution 2 - C#

I felt important to share the Nullable<T>.GetValueOrDefault() method which is particularly handy when working with math computations that use Nullable<int> aka int? values. There are many times when you don't have to check HasValue property and you can just use GetValueOrDefault() instead.

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());

Command line showing the code above working

Solution 3 - C#

var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJon SchneiderView Question on Stackoverflow
Solution 1 - C#Jon SchneiderView Answer on Stackoverflow
Solution 2 - C#Brian OgdenView Answer on Stackoverflow
Solution 3 - C#Rufus LView Answer on Stackoverflow