C#8では、参照型をnull可能として明示的にマークする必要があります。
デフォルトでは、これらの型には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;
}