title: C# type arguments cannot be inferred from usage in Select with multiple returns
body: <p>I don't think I'm doing anything too esoteric, but I don't see any other questions about this.</p>
  
  <p>The following code (I've reduced it to the essentials) generates a compiler error in C# 4.  However, it should be obvious what the type argument is - there's a greatest common denominator ("class A") that is also explicitly defined in the return type of the method "Frob".  Shouldn't the compiler make a list of all the return types in the lambda expression, create an ancestry tree to find their common ancestors, and then reconcile that with the expected return type of the containing method?</p>
  
  <blockquote>
    <p>The type arguments for method 'System.Linq.Enumerable.Select(System.Collections.Generic.IEnumerable, System.Func)' cannot be inferred from the usage. Try specifying the type arguments explicitly.</p>
  </blockquote>
  
  <pre><code>using System.Collections.Generic;
  using System.Linq;
  using System.Text.RegularExpressions;
  
  namespace Sample
  {
      public abstract class A
      {
          private A(int index) { /* ... */ }
  
          public sealed class A1 : A
          {
              public A1(string text, int index)
                  : base(index)
              { /* ... */ }
          }
  
          public sealed class A2 : A
          {
              public A2(int index)
                  : base(index)
              { /* ... */ }
          }
  
          private static Regex _regex = new Regex(@"(to be)|(not to be)");
          public static IEnumerable&lt;A&gt; Frob(string frobbable)
          {
              return _regex.Matches(frobbable)
                  .Cast&lt;Match&gt;()
                  .Select((match, i) =&gt;
                  {
                      if (match.Groups[1].Success)
                      {
                          return new A1(match.Groups[1].Value, i);
                      }
                      else
                      {
                          return new A2(i);
                      }
                  });
          }
      }
  }
  </code></pre>