Nehmen Sie die folgende generische Methode:
public static T Get<T>(T value)
{
return value;
}
Wenn wir es so nennen Get<string>(s), ist die Rückgabe nicht nullbar, und wenn wir es tun Get<string?>(s), ist sie nullbar.
Allerdings , wenn Sie es mit einem generischen Argumente wie fordern Get<T>(x)und Tnicht gelöst wird , ist es beispielsweise ein generisches Argument zu Ihrer allgemeinen Klasse wie unten ...
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// is result nullable or non-nullable? It depends on T
}
}
Hier weiß der Compiler nicht, ob er irgendwann mit einem nullbaren oder nicht nullbaren Typ aufgerufen wird.
Es gibt eine neue Typbeschränkung, mit der wir signalisieren können, dass Tsie nicht null sein darf:
public static T Get<T>(T value) where T: notnull
{
return value;
}
Wo Tjedoch nicht eingeschränkt und noch offen ist, ist die Nullbarkeit unbekannt.
Wenn diese Unbekannten als nullwertfähig behandelt würden, könnten Sie den folgenden Code schreiben:
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// reassign result to null, cause we we could if unknown was treated as nullable
result = null;
}
}
In dem Fall, in dem Tnicht nullbar war, hätten wir eine Warnung erhalten sollen. Bei unbekannten Nullbarkeitstypen möchten wir also Warnungen beim Dereferenzieren, aber auch Warnungen für die potenzielle Zuweisung null.