Мне довольно удобно с дженериками, но, будучи человеком, которому нравится понимать каждую деталь, у меня есть этот вопрос. В моей реализации метода Where
расширения LINQОбщий вывод типа
public static class Extensions
{
public static IEnumerable<T> Where<T>(
this IEnumerable<T> source, Func<T, bool> predicate)
{
foreach (T element in source)
if (predicate(element))
yield return element;
}
}
почему в Where<T>
необходимости T
? Почему тип не может быть выведен из T
в IEnumerable<T>
? Иными словами, почему подпись не может быть
public static IEnumerable<T> Where(this IEnumerable<T> source, Func<T, bool> predicate)
Спасибо за любую помощь.
Я думаю, что он может, но он есть там, где он не может. Вы можете использовать 'Where', не поставляя' T' в большинстве случаев. –
@JonathanWood: Он говорит о подписи декларации, а не о вызове. –
Ну, для того, чтобы когда-либо быть в состоянии предоставить 'T', в любом случае это должно быть в декларации. Что я упустил? –