Я нашел (примерно) этот код в Enumerable.Single
при проверке его с помощью некоторого декомпилятора:
foreach (TSource current in source)
{
if (predicate(current))
{
result = current;
num += 1L;
}
}
if (num > 1L)
{
throw Error.MoreThanOneMatch();
}
Как вы можете видеть, он перебирает все элементы перед бросанием. Почему он не разбивается, когда num > 1
?