When I wrote about Array.Empty<T>(), one of the common questions readers asked was:

What is the difference between Array.Empty<T>() and Enumerable.Empty<TResult>()?

The primary difference is the return type: Array.Empty<T>() returns T[] (an array), whereas Enumerable.Empty<TResult>() returns IEnumerable<TResult> (an enumerable).

You’re going to be able to do more with the result of Array.Empty<T>() than Enumerable.Empty<TResult>() as arrays implement the gamut of collection interfaces (e.g. IList<T>, IReadOnlyList<T>, ICollection<T>, IReadOnlyCollection<T>, IEnumerable<T>, etc.), in addition to all the functionality that Array itself provides.

There’s also a difference in layering:

  • Array.Empty<T>() is at the lowest layer on the System.Array type in System.Runtime.dll in .NET Core (mscorlib.dll in .NET Framework).

  • Enumerable.Empty<TResult>() is in a higher layer on the System.Linq.Enumerable type in System.Linq.dll in .NET Core (System.Core.dll in .NET Framework).

In .NET Framework, Array.Empty<T>() and Enumerable.Empty<TResult>() each have their own separate caches, but I recently changed Enumerable.Empty<TResult>() in .NET Core to simply return the result of calling Array.Empty<T>(), so both are now backed by the same cache in .NET Core. I’m not sure when/if this change will flow into a future version of .NET Framework.

Going forward, I’ll be using Array.Empty<T>() over Enumerable.Empty<TResult>() as Array.Empty<T>()’s return type provides more functionality (array vs. IEnumerable<T>) and requires less dependencies (lower layer).

Questions or comments? I'm @justinvp on Twitter.

Archive