Я работаю с библиотекой, в которой есть некоторые методы «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