Тестирование на ноль без влияния на анализатор C# 8, обнуляемый - PullRequest
1 голос
/ 12 января 2020

При включенном C# 8, обнуляемом, следующий код не генерирует ошибок.

var x = GetObjectX();
return x;

При добавлении одной строки я получаю предупреждение:

var x = GetObjectX();
Debug.Assert(x != null);
return x; //Warning: 'X' may be null here. Possible null reference return.

Это ожидаемое поведение ?

Причина, по которой я не доверяю обнуляемому алгоритму без строки отладки, заключается в том, что возвращаемый объект десериализован.

Какой самый чистый способ подавить предупреждение?

Ответы [ 2 ]

2 голосов
/ 12 января 2020

Попробуйте оператор null forgiving ! Это может быть использовано, когда вы знаете, лучше, чем компилятор, что переменная Nullable не будет иметь значение null во время выполнения.

var x = GetObjectX();
Debug.Assert(x != null);
return x!;
1 голос
/ 12 января 2020

In. NET Core 3, Debug.Assert помечен [DoesNotReturnWhen(false)], что помогает компиляции понять код и избежать предупреждения.

Без него компилятор видит нулевой тест как индикация от пользователя, что значение могло быть нулевым в конце концов.

Вы можете сделать свой собственный метод утверждения, если не используете. NET Core 3. См. RoslynDebug.Assert в качестве примера.

...