Query Expression Pattern C# 3.0 には Query expression pattern というものがあって,このパターンと同じ構造を持つ型はクエリ式に使うことができます.IEnumerable<T> かどうかは関係ありません.duck-typing みたいですね. delegate R Func<T1,R>(T1 arg1); delegate R Func<T1,T2,R>(T1 arg1, T2 arg2); class C { public C<T> Cast<T>(); } class C<T> { public C<T> Where(Func<T,bool> predicate); public C<U> Select<U>(Func<T,U> selector); public C<V> SelectMany<U,V>(Func<T,C<U>>