Что касается синтаксиса запроса LINQ...
var foo = new List<int> { 1, 2 };
var boo = from n in foo
where n > 1
select n;
... Я всегда думал, что этот синтаксис ограничен работой с IEnumerable. По крайней мере, пока я не узнал об IQueryable. И, возможно, IObservable тоже. Но недавно я заметил предположение, что синтаксис запроса основан на утином вводе. Эта история не выглядела очень убедительной, пока я не нашел сайт, посвященный LINQ to Tasks. Похоже, что LINQ to Tasks полностью зависит от утиного ввода с синтаксисом запроса!
Хорошо, что здесь происходит? Синтаксис запроса использует утиную печать или нет? Когда я попробовал сам, конечно же, это работает и, кажется, доказывает, что все дело в утиной печати, а не в IEnumerable:
public class Joker<T>
{
public T Item;
public Joker(T item)
{
Item = item;
}
}
public static class JokerHelp
{
public static T2 Select<T,T2>(this Joker<T> joke, Func<T,T2> call)
{
return call(joke.Item);
}
}
var oof = new Joker<int>(5);
int foo = from a in oof
select a;
Если утиная типизация — это то, как работает синтаксис запроса, как это, очевидно, и происходит, где может быть официальная (MSDN) документация по этому поводу? Или любая разумная документация?