Добавить проверку на обнуляемость для переменной out, которая не аннотирована должным образом.C#

Место общения программистов C#
Ответить
Anonymous
 Добавить проверку на обнуляемость для переменной out, которая не аннотирована должным образом.

Сообщение Anonymous »

Я работаю с библиотекой, в которой есть некоторые методы «Try», которые не имеют должным образом аннотаций для передачи информации о допустимости значений NULL. Это становится проблемой, когда компилятор не может определить, является ли переменная нулевой или нет.
// signature: bool TryGetProperty(string propName, out string? value); // (no NotNullWhen(true) attribute)

if (!obj.TryGetProperty(propName, out var value))
{
// fail case
throw ...;
}

// compiler doesn't know that `value` cannot be null at this point
UseTheValue(obj, value!); // have to add '!' to dismiss the warnings

AnotherUseOfValue(obj, value!); // other uses doesn't affect the nullability

Похоже, что единственный способ сообщить компилятору, что оно не равно нулю, — это добавить дополнительную явную проверку нуля в другом месте или получить доступ к свойству объекта в области видимости. Проблема в том, что я не всегда буду работать с объектом непосредственно в окружающем коде.
if (value is not null) // redundant
AnotherUseOfValue(obj, value); // value is not null now

//or

_ = value.someProperty; // value cannot be null if this succeeds

Есть ли способы восстановить эту нулевую проверку без необходимости ее явного добавления, без обновления библиотеки для добавления правильной аннотации? Отключить предупреждения невозможно.
Это выглядит менее проблематично, но мне это не нравится:
if (!obj.TryGetProperty(propName, out var value) || value is null) // add extraneous check here
{
// fail case
throw ...;
}


Подробнее здесь: https://stackoverflow.com/questions/798 ... -annotated
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»