title: Why does IEnumerable<T>.ToList<T>() return List<T> instead of IList<T>?
body: <p>The extension method <code>ToList()</code> returns a <code>List&lt;TSource&gt;</code>. Following the same pattern, <code>ToDictionary()</code> returns a <code>Dictionary&lt;TKey, TSource&gt;</code>.</p>
  
  <p>I am curious why those methods do not type their return values as <code>IList&lt;TSource&gt;</code> and <code>IDictionary&lt;TKey, TSource&gt;</code> respectively. This seems even odder because <code>ToLookup&lt;TSource, TKey&gt;</code> types its return value as an interface instead of an actual implementation.</p>
  
  <p>Looking at the source of those extension methods using <a href="http://www.jetbrains.com/decompiler/">dotPeek</a> or other decompiler, we see the following implementation (showing <code>ToList()</code> because it is shorter):</p>
  
  <pre><code>public static List&lt;TSource&gt; ToList&lt;TSource&gt;(this IEnumerable&lt;TSource&gt; source) { 
     if (source == null) throw Error.ArgumentNull("source");
     return new List&lt;TSource&gt;(source); 
  }
  </code></pre>
  
  <p>So why does this method type its return value as a specific implementation of the interface and not the interface itself? The only change would be the return type.</p>
  
  <p>I am curious because the <code>IEnumerable&lt;&gt;</code> extensions are very consistent in their signatures, except for those two cases. I always thought it to be a bit strange.</p>
  
  <p>Additionally, to make things even more confusing, the <a href="http://msdn.microsoft.com/en-us/library/bb549073.aspx">documentation for <code>ToLookup()</code></a> states:</p>
  
  <blockquote>
    <p>Creates a Lookup from an IEnumerable according to a
    specified key selector function.</p>
  </blockquote>
  
  <p>but the return type is <code>ILookup&lt;TKey, TElement&gt;</code>.</p>
  
  <p>In <a href="http://code.google.com/p/edulinq/">Edulinq</a>, Jon Skeet mentions that the return type is <code>List&lt;T&gt;</code> instead of <code>IList&lt;T&gt;</code>, but does not touch the subject further.<br>
  Extensive searching has yielded no answer, so here I ask you:</p>
  
  <p><strong>Is there any design decision behind not typing the return values as interfaces, or is it just happenstance?</strong></p>