In C#, value types (like int, float, bool) normally cannot store null. To solve this, C# 2.0 introduced nullable types using System.Nullable<T>, which let value types hold either their normal range of values or null (e.g., int? x = null;).
For reference types, nullable reference types were added in C# 8.0 to clearly specify whether a reference can be null, helping avoid NullReferenceException. For example, in nullable of integer type you can store values from -2147483648 to 2147483647 or null value.
Syntax
Nullable<data_type> variable_name = null;
Or you can also use a shortcut which includes ? operator with the data type.
datatype? variable_name = null;
Example:
// this will give compile time error
int j = null;
// Valid declaration
Nullable<int> j = null;
// Valid declaration
int? j = null;
Access the value of Nullable type variables
You cannot directly access the value of the Nullable type. You have to use GetValueOrDefault() method to get an original assigned value if it is not null. You will get the default value if it is null. The default value for null will be zero.
Example:
C# using System; class Geeks { static void Main(string[] args) { // defining Nullable type Nullable<int> n = null; // using the method output will be 0 as default value of null is 0 Console.WriteLine(n.GetValueOrDefault()); // defining Nullable type int? n1 = null; // using the method output will be 0 as default value of null is 0 Console.WriteLine(n1.GetValueOrDefault()); // using Nullable type syntax to define non-nullable int? n2 = 47; // using the method Console.WriteLine(n2.GetValueOrDefault()); // using Nullable type syntax to define non-nullable Nullable<int> n3 = 457; // using the method Console.WriteLine(n3.GetValueOrDefault()); } } Characteristics of Nullable types
- With the help of nullable type you can assign a null value to a variable without creating nullable type based on the reference type.
- In Nullable types, you can also assign values to nullable type. As shown in the below example.
Example 1:
C# using System; class GFG { static public void Main() { // a is nullable type and contains null value int ? a = null; // b is nullable type int and behave as a normal int int ? b = 2345; // this will not print anything on console Console.WriteLine(a); // gives 2345 as output Console.WriteLine(b); } } - You can use Nullable.HasValue and Nullable.Value to check the value.
- If the object assigned with a value, then it will return "True" and if the object is assigned to null, then it will return "False".
- If the object is not assigned with any value then it will give compile-time error.
Example 2:
C# using System; class GFG { static void Main() { // a is nullable type and contains null value Nullable<int> a = null; // check the value of object Console.WriteLine(a.HasValue); // b is nullable type and contains a value Nullable<int> b = 7; // check the value of object Console.WriteLine(b.HasValue); } } - You can also use == and ! operators with nullable type.
- You can also use GetValueOrDefault(T) method to get the assigned value or the provided default value, if the value of nullable type is null.
- You can also use null-coalescing operator(??) to assign a value to the underlying type originate from the value of the nullable type.
Example 3:
C# using System; class GFG { static public void Main() { // a is nullable type and contains null value int ? a = null; // it means if a is null then assign 3 to b int b = a ?? 3; // It will print 3 Console.WriteLine(b); } } - Nullable types do not support nested Nullable types.
- Nullable types do not support var type. If you use Nullable with var, then the compiler will give you a compile-time error.
Advantage of Nullable Types
- The main use of nullable type is in database applications. Suppose, in a table a column required null values, then you can use nullable type to enter null values.
- Nullable type is also useful to represent undefined value.
- You can also use Nullable type instead of a reference type to store a null value.
Explore
Introduction
Fundamentals
Control Statements
OOP Concepts
Methods
Arrays
ArrayList
String
Tuple
Indexers