W systemie System System.array Claine 3.0. Nie rozumiem, dlaczego jest użycie ! Jeśli parametr match nie ma operatora ? i nie otrzymujemy kompilatora ostrzeżenia?

public static int FindIndex<T>(T[] array, int startIndex, int count, Predicate<T> match)
        {
            //
           ...
            //
            if (match == null)
            {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
            }

            int endIndex = startIndex + count;
            for (int i = startIndex; i < endIndex; i++)
            {
                if (match!(array[i])) <--- 
                    return i;
            }
            return -1;
        }
1
Evgeniy Terekhin 25 grudzień 2019, 13:32

1 odpowiedź

Najlepsza odpowiedź

Nie zobaczysz tego operatora w kodzie źródłowym Lates, ale jeśli spróbujesz sprawdzić Git Blame na stronie Github, możesz zobaczyć mały komentarz: Array.cl

// Todo-NULLOWE: Usuń! kiedy szanowany [isznotrenturn]

Następnie, jeśli przyjrzysz się bliżej tego kodu:

if (match == null)
{
    ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}

I porównaj go do:

if (match == null)
{
    throw new ArgumentNullException(nameof(match));
}

Widać, że sprawdza null, a następnie rzuca wyjątek (odbywa się metodą pomocnika ThrowHelper.ThrowArgumentNullException), ale kompilator nie wie, że ta metoda "przerwie" wykonanie {{x2} } Metoda, gdy match oznacza null (ponieważ [DoesNotReturn] atrybut nie jest jeszcze zaimplementowany). Więc kompilator wygeneruje błąd, ponieważ pomyślał, że match jest nadal może być null i musimy wymusić kompilator, aby go zignorować. Później atrybut został wdrożony, a operator ! został usunięty. ) Kod metody pomocnika )

2
Exploding Kitten 25 grudzień 2019, 11:31