Ambil metode generik berikut:
public static T Get<T>(T value)
{
return value;
}
Jika kita menyebutnya seperti itu Get<string>(s)
, pengembaliannya tidak dapat dibatalkan, dan jika kita lakukan Get<string?>(s)
, itu tidak dapat dibatalkan.
Namun jika Anda memanggilnya dengan argumen umum seperti Get<T>(x)
dan T
tidak terselesaikan, misalnya itu adalah argumen umum untuk kelas generik Anda seperti di bawah ini ...
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// is result nullable or non-nullable? It depends on T
}
}
Di sini kompiler tidak tahu apakah pada akhirnya akan dipanggil dengan tipe nullable atau non-nullable.
Ada batasan tipe baru yang bisa kita gunakan untuk memberi sinyal yang T
tidak boleh nol:
public static T Get<T>(T value) where T: notnull
{
return value;
}
Namun, di mana T
tidak dibatasi dan masih terbuka, nullability tidak diketahui.
Jika tidak diketahui ini diperlakukan sebagai nullable maka Anda dapat menulis kode berikut:
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;
}
}
Dalam kasus T
yang tidak dapat dibatalkan, kita seharusnya mendapat peringatan. Jadi dengan jenis nullability yang tidak diketahui, kami ingin peringatan saat dereferencing, tetapi juga peringatan untuk penetapan yang berpotensi null
.