Ich arbeite mit einer Bibliothek, die über einige „Try“-Methoden verfügt, die nicht ordnungsgemäß annotiert sind, um Nullbarkeitsinformationen zu übergeben. Dies wird problematisch, wenn der Compiler nicht feststellen kann, ob die Variable null ist oder nicht.
Code: Select all
// 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
Es scheint, dass die einzige Möglichkeit, dem Compiler mitzuteilen, dass es nicht null ist, darin besteht, an anderer Stelle eine zusätzliche explizite Nullprüfung hinzuzufügen oder auf eine Eigenschaft außerhalb des Objekts im Bereich zuzugreifen. Das
Problem ist, dass ich das Objekt nicht immer direkt im umgebenden Code bearbeiten werde.
Code: Select all
if (value is not null) // redundant
AnotherUseOfValue(obj, value); // value is not null now
//or
_ = value.someProperty; // value cannot be null if this succeeds
Gibt es Möglichkeiten, diese Nullprüfung wiederherzustellen, ohne sie explizit hinzufügen zu müssen, ohne die Bibliothek zu aktualisieren, um die richtige Anmerkung hinzuzufügen? Das Ausschalten der Warnungen ist keine Option.
Das sieht weniger problematisch aus, gefällt mir aber nicht:
Code: Select all
if (!obj.TryGetProperty(propName, out var value) || value is null) // add extraneous check here
{
// fail case
throw ...;
}