C # 8에서는 참조 유형을 명시 적으로 널 입력 가능으로 표시해야합니다.
기본적으로 이러한 유형은 값 유형과 비슷한 null을 포함 할 수 없습니다. 이것은 후드 아래에서 작동하는 방식을 변경하지 않지만 유형 검사기는 수동으로 수행해야합니다.
주어진 코드는 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;
}