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 T
nicht 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 T
sie nicht null sein darf:
public static T Get<T>(T value) where T: notnull
{
return value;
}
Wo T
jedoch 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 T
nicht 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
.