Skip to main content

Nullability

In C#, the null literal is used to denote the absence of a value. A nullable type is a type that allows for null values.

info

Prior to C# 8.0, reference types were always nullable and value types were not. A value type can be made nullable though by appending it with a question mark (?).

string nullableReferenceType = "hello";
nullableReferenceType = null; // Valid as type is nullable

int nonNullableValueType = 5;
nonNullableValueType = null; // Compile error as type is not nullable

int? nullableValueType = 5; // Define nullable value type
nullableValueType = null; // Valid as type is nullable

Accessing a member of a variable which value is null will compile fine, but result in a NullReferenceException being thrown at runtime:

string sentence = null;

// Throws NullReferenceException at runtime
sentence.Length;

To counter this common type of mistake, C# 8 allows one to opt-into a feature that makes reference types non-nullable by default:

string nonNullableReferenceType = "book";
nonNullableReferenceType = null; // Compile warning (no error!)

string? nullableReferenceType = "movie";
nullableReferenceType = null; // Valid as type is nullable

The ?? operator allows one to return a default value when the value is null:

string? name1 = "John";
name1 ?? "Paul"; // => "John"

string? name2 = null;
name2 ?? "George"; // => "George"

The ?. operator allows one to call members safely on a possibly null value:

string? fruit = "apple";
fruit?.Length; // => 5

string? vegetable = null;
vegetable?.Length; // => null