Nullable Types
Reference types can represent a nonexistent value with a null reference. Value types, however, cannot ordinarily represent null values. For example:
string s = null; // OK - reference type. int i = null; // Compile error - int cannot be null.
To represent null in a value type, you must use a special
construct called a nullable type. A nullable type is
denoted with a value type followed by the ? symbol:
int? i = null; // OK - Nullable Type
Console.WriteLine (i == null); // TrueNullable<T> Struct
T? translates into System.Nullable<T>. Nullable<T> is a lightweight immutable
structure, having only two fields, to represent Value and HasValue. The essence of System.Nullable<T> is very
simple:
public struct Nullable<T> where T : struct
{
public T Value {get;}
public bool HasValue {get;}
public T GetValueOrDefault();
public T GetValueOrDefault (T defaultValue);
...
}The code:
int? i = null; Console.WriteLine (i == null); // True
translates to:
Nullable<int> i = new Nullable<int>(); Console.WriteLine (! i.HasValue); // True
Attempting to retrieve Value
when HasValue is false throws an
InvalidOperationException. GetValueOrDefault() returns Value if HasValue is true; otherwise, it returns
new T() or a specified custom default
value.
The default value of T? is
null.
Nullable Conversions
The conversion from T to
T? is implicit, and from T? to T is
explicit. For example:
int? x = 5; // implicit int y = (int)x; // explicit
The explicit cast is directly equivalent to calling the nullable object’s ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access