使用 .NET 4,我对编译器无法解析下面示例中的第一个方法调用感到困惑。
using System;
namespace MethodResolutionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            NonGeneric foo = null;
            // ambiguous
            foo.Ext1(x => new NonGeneric());
            // resolves to first Ext1
            foo.Ext1(x => new NonGeneric(), 1);
            // resolves to first Ext2
            foo.Ext2(x => new NonGeneric());
            // resolves to first Ext2
            foo.Ext2(x => new NonGeneric(), 1);
            // resolves to second Ext2
            foo.Ext2(x => "foo");
            // resolves to second Ext2
            foo.Ext2(x => "foo", 1);
            // resolves to first Ext3
            foo.Ext3(x => new NonGeneric());
            // resolves to first Ext3
            foo.Ext3(x => new NonGeneric(), 1);
            // resolves to second Ext3
            foo.Ext3(x => "foo");
            // resolves to second Ext3
            foo.Ext3(x => "foo", 1);
        }
    }
    public class NonGeneric
    {
    }
    public class Generic<T> : NonGeneric
    {
    }
    public static class Extensions1
    {
        public static NonGeneric Ext1(this NonGeneric first, Func<NonGeneric, NonGeneric> getNext, int i = 0)
        {
            return null;
        }
        public static Generic<TNext> Ext1<TNext>(this NonGeneric first, Func<NonGeneric, TNext> getNext, int i = 0, string s = null)
        {
            return null;
        }
    }
    // only difference between Extensions2 and Extensions1 is that the second overload no longer has a default string parameter
    public static class Extensions2
    {
        public static NonGeneric Ext2(this NonGeneric first, Func<NonGeneric, NonGeneric> getNext, int i = 0)
        {
            return null;
        }
        public static Generic<TNext> Ext2<TNext>(this NonGeneric first, Func<NonGeneric, TNext> getNext, int i = 0)
        {
            return null;
        }
    }
    // Extensions3 explicitly defines an overload that does not default the int parameter
    public static class Extensions3
    {
        public static NonGeneric Ext3(this NonGeneric first, Func<NonGeneric, NonGeneric> getNext)
        {
            return Ext3(first, getNext, default(int));
        }
        public static NonGeneric Ext3(this NonGeneric first, Func<NonGeneric, NonGeneric> getNext, int i = 0)
        {
            return null;
        }
        public static Generic<TNext> Ext3<TNext>(this NonGeneric first, Func<NonGeneric, TNext> getNext, int i = 0)
        {
            return null;
        }
    }
}
任何人都可以对此有所了解吗?我怀疑除了修改我的 API 以帮助编译器(如上所述)之外,我真的没有前进的道路Extensions3,但如果有更简单/更好的方法,那么我很想听听。