Nullable reference types là tính năng phân tích tĩnh lúc biên dịch giúp giảm NullReferenceException.
Khi bật (<Nullable>enable</Nullable> trong csproj — mặc định của project mới), compiler coi mọi reference type là không được null, muốn cho phép null thì khai báo string?.
string name = null; // warning CS8600
string? maybe = null; // fine
int length = maybe.Length; // warning CS8602: possible dereference of nullMấu chốt hay bị hỏi: đây chỉ là warning, không phải error, và không có gì thay đổi lúc runtime — không có kiểm tra null nào được sinh thêm. Dữ liệu từ ngoài (JSON, DB, reflection) vẫn có thể đưa null vào một biến khai báo không-null.
Toán tử ! (null-forgiving) tắt cảnh báo cho một biểu thức: user!.Name nghĩa là "tôi bảo đảm chỗ này không null". Nó không sinh ra kiểm tra nào, chỉ đổi trạng thái null trong phân tích của compiler — dùng bừa là quay lại đúng bug cũ. Chỉ dùng khi bạn chắc chắn nhưng không diễn đạt được qua kiểu, ví dụ sau một hàm kiểm tra tuỳ biến.
Muốn ép nghiêm ngặt thì bật <WarningsAsErrors>Nullable</WarningsAsErrors>.