Regarding LINQ query syntax...
var foo = new List { 1, 2 };
var boo = from n in foo
where n > 1
select n;
There are a few features in C# that the compiler does structural type matching rather than nominal type matching. Examples include the foreach
loop, query comprehension syntax (the select
, where
, etc), and await
/async
. For all of these features, the compiler is actually just looking for methods with certain names, not specific interfaces or classes.
The reason these features are not tied to specific interfaces is to decouple the language from the .NET framework implementation as much as possible. I suppose this would be considered a form of duck typing.
Eric Lippert explains the feature and reasoning much more thoroughly here.
I have noticed that the MSDN documentation is often wrong or incomplete about these features.