C # 8 में स्पष्ट रूप से संदर्भ प्रकारों को अशक्त के रूप में चिह्नित करना चाहिए।
डिफ़ॉल्ट रूप से, वे प्रकार मूल्य प्रकार के समान शून्य, थोड़े समाहित करने में सक्षम नहीं हैं। हालांकि यह नहीं बदलता है कि हुड के तहत चीजें कैसे काम करती हैं, टाइप परीक्षक को आपको मैन्युअल रूप से ऐसा करने की आवश्यकता होगी।
दिए गए कोड को C # 8 के साथ काम करने के लिए फिर से शुरू किया गया है, लेकिन यह इस नई सुविधा से लाभ नहीं करता है।
public static Delegate? Combine(params Delegate?[]? delegates)
{
// ...[]? delegates - is not null-safe, so check for null and emptiness
if (delegates == null || delegates.Length == 0)
return null;
// Delegate? d - is not null-safe too
Delegate? d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
d = Combine(d, delegates[i]);
return d;
}
इस सुविधा का लाभ उठाते हुए एक अद्यतन कोड (काम नहीं, सिर्फ एक विचार) का एक उदाहरण है। इसने हमें अशक्त होने से बचाया और इस पद्धति को थोड़ा सरल बनाया।
public static Delegate? Combine(params Delegate[] delegates)
{
// `...[] delegates` - is null-safe, so just check if array is empty
if (delegates.Length == 0) return null;
// `d` - is null-safe too, since we know for sure `delegates` is both not null and not empty
Delegate d = delegates[0];
for (int i = 1; i < delegates.Length; i++)
// then here is a problem if `Combine` returns nullable
// probably, we can add some null-checks here OR mark `d` as nullable
d = Combine(d, delegates[i]);
return d;
}