When to use Null Forgiving (!) vs Non-Nullable casts - C#