Do not confuse the declared return type with the actual return type. Concat declared as a return IEnumerable<T> , but it actually returns an instance of a specific type that implements IEnumerable<T> . GetType returns a specific type, not a declared return type.
As for the strange name, Concat is implemented with an iterator block, and the iterator blocks are converted by the compiler to types with names such as Enumerable+d__71 that implement IEnumerable<T> .
source share