The NullReferenceException is famously called the 'Billion Dollar Mistake.' It happens when you try to access a method on a variable that points to null. Modern C# (8+) introduced Nullable Reference Types to stop this at compile time before you even run your app.
In modern .NET project files (.csproj), you will see <Nullable>enable</Nullable>. This 180-degree shift means that by default, NO reference type is allowed to be null! You must explicitly opt-in if you want to allow a null value.
// ❌ COMPILER WARNING: You must initialize this! It cannot be null.
string myName;
// ✅ GOOD: Initialized
string myName = "Sandeep";
// ✅ OPT-IN NULL: The '?' tells the compiler "I am okay with this being empty."
string? myEmail = null;
Sometimes you (the human) KNOW a variable won't be null, but the compiler is too paranoid. You use the ! operator to tell the compiler to "shut up and trust me."
string? email = GetEmailFromDatabase();
// Compiler is worried this might crash.
// Use '!' to suppress the warning if you are 100% sure it's safe.
ProcessEmail(email!);
Instead of writing endless if (x != null) checks, modern C# provides elegant shorthands.
// 1. Null-Conditional (?.)
// If user is null, it returns null. It DOES NOT crash!
var city = user?.Address?.City;
// 2. Null-Coalescing (??)
// If the left side is null, use the default value on the right
var activeEmail = email ?? "no-email@toolliyo.com";
Q: "Since Value Types like 'int' cannot be null because they are stored on the Stack, why does C# still allow us to write 'int? age = null;'?"
Architect Answer: "That is a 'Nullable Value Type,' and under the hood, the compiler translates `int?` into the `Nullable