ใช้วิธีการทั่วไปดังต่อไปนี้:
public static T Get<T>(T value)
{
return value;
}
ถ้าเราเรียกมันว่าGet<string>(s)
ผลตอบแทนไม่ใช่โมฆะและถ้าเราทำGet<string?>(s)
มันก็เป็นโมฆะ
อย่างไรก็ตามหากคุณกำลังเรียกมันด้วยอาร์กิวเมนต์ทั่วไปเช่นGet<T>(x)
และT
ไม่ได้รับการแก้ไขตัวอย่างเช่นมันเป็นอาร์กิวเมนต์ทั่วไปสำหรับคลาสทั่วไปของคุณเช่นด้านล่าง ...
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// is result nullable or non-nullable? It depends on T
}
}
ที่นี่คอมไพเลอร์ไม่ทราบว่าในที่สุดมันจะถูกเรียกด้วยประเภทที่เป็นโมฆะหรือไม่เป็นโมฆะ
มีข้อ จำกัด ประเภทใหม่ที่เราสามารถใช้เป็นสัญญาณที่T
ไม่สามารถเป็นโมฆะได้:
public static T Get<T>(T value) where T: notnull
{
return value;
}
อย่างไรก็ตาม, ที่T
ไม่มีข้อ จำกัด และยังคงเปิดอยู่, ความเป็นโมฆะไม่เป็นที่รู้จัก
หากไม่ทราบสิ่งเหล่านี้ถือว่าเป็นโมฆะคุณสามารถเขียนรหัสต่อไปนี้:
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;
}
}
ในกรณีที่T
ไม่เป็นโมฆะเราควรได้รับคำเตือน ดังนั้นด้วยประเภท nullability ที่ไม่รู้จักเราต้องการคำเตือนเมื่อ dereferencing null
แต่ยังมีคำเตือนสำหรับการกำหนดที่อาจเกิดขึ้น