A nullable value type can hold either a value or null.

nullable A nullable value type uses `?`, such as `int?`, to allow `null`.

Nullable Values

score
NullableValues.cs
Replay: real traced execution (multi-file project)
using System;

class Program
{
    static void Main()
    {
        int? score = 90;
        string status = score.HasValue ? "has score" : "missing";
        int displayed = score ?? 0;

        Console.WriteLine($"status={status}");
        Console.WriteLine($"displayed={displayed}");
    }
}
using System;

class Program
{
    static void Main()
    {
        int? score = null;
        string status = score.HasValue ? "has score" : "missing";
        int displayed = score ?? 0;

        Console.WriteLine($"status={status}");
        Console.WriteLine($"displayed={displayed}");
    }
}
using System;

class Program
{
    static void Main()
    {
        int? score = 75;
        string status = score.HasValue ? "has score" : "missing";
        int displayed = score ?? 0;

        Console.WriteLine($"status={status}");
        Console.WriteLine($"displayed={displayed}");
    }
}
  1. score ← 90, status ← has score, displayed ← 90

    4{5    static void Main()6    {7        int? score→ 90 = 90; //@score=null, 758        string status→ has score = score.HasValueTrue ? "has score" : "missing";9        int displayed→ 90 = score90 ?? 0;1011        Console.WriteLine($"status={statushas score}");12        Console.WriteLine($"displayed={displayed90}");13    }
    outputstatus=has score
    displayed=90
  1. score ← (empty), status ← missing, displayed ← 0

    4{5    static void Main()6    {7        int? score→ (empty) = null;8        string status→ missing = score.HasValueFalse ? "has score" : "missing";9        int displayed→ 0 = score(empty) ?? 0;1011        Console.WriteLine($"status={statusmissing}");12        Console.WriteLine($"displayed={displayed0}");13    }
    outputstatus=missing
    displayed=0
  1. score ← 75, status ← has score, displayed ← 75

    4{5    static void Main()6    {7        int? score→ 75 = 75;8        string status→ has score = score.HasValueTrue ? "has score" : "missing";9        int displayed→ 75 = score75 ?? 0;1011        Console.WriteLine($"status={statushas score}");12        Console.WriteLine($"displayed={displayed75}");13    }
    outputstatus=has score
    displayed=75

Follow the Nullable Value

  1. score starts as 90.
  2. score.HasValue is true.
  3. status becomes has score.
  4. displayed = score ?? 0 becomes 90.
  5. The program prints status=has score and displayed=90. | score | status | displayed | | --- | --- | --- | | null | missing | 0 | | 75 | has score | 75 | | 90 | has score | 90 |

Exercise: NullableValues.cs

Reproduce displayed=90, then use score null and 75 to predict status and displayed.