Nullable warnings are not just compiler noise. They are often feedback that a type, API, or initialization path is not explicit enough.

Do not silence them reflexively with !. The null-forgiving operator can be useful at a boundary the compiler cannot understand, but it should not become a way to hide uncertain object state. If a property is required, make it required. If a value can be missing, model that in the type. If a method cannot accept null, let the signature say so.

For example, this hides an invalid construction path:

public sealed class CreateUserCommand
{
    public string Email { get; set; } = null!;
}

If the caller must provide the value, make that part of the type:

public sealed class CreateUserCommand
{
    public required string Email { get; init; }
}

required does not replace validation for untrusted input, but it does stop your own code from pretending the object can be valid without that state.

This matters most at application boundaries: configuration, deserialization, database projections, external API responses, command handlers, and background jobs. Those are places where null values often enter even when the happy path looks clean.

When a nullable warning appears, ask what the code is trying to say. Maybe the object has an invalid construction path. Maybe a method accepts more than it should. Maybe the fallback case is missing. Maybe the data contract is lying.

The goal is not zero warnings as a vanity metric. The goal is code where nullability describes reality closely enough that the next developer can trust the shape.