C# 重载泛型扩展方法

C# 重载泛型扩展方法,c#,extension-methods,C#,Extension Methods,我在重载扩展方法时遇到问题 我有两种扩展方法: 方法A-对于标准对象: public static bool HasChanged<T>(this T obj1, T obj2, Func<T, T, bool> equalityExpression) 方法B-对于IEnumerables: public static bool HasChangedList<T>(this IEnumerable<T> obj1, IEnumerable<

我在重载扩展方法时遇到问题

我有两种扩展方法:

方法A-对于标准对象:

public static bool HasChanged<T>(this T obj1, T obj2, Func<T, T, bool> equalityExpression)
方法B-对于IEnumerables:

public static bool HasChangedList<T>(this IEnumerable<T> obj1, IEnumerable<T> obj2, Func<T, T, bool> isEqualExpression)
但是我想给他们两个相同的名字,这是目前不起作用的,因为IEnumerable也是对象,所以编译器无法决定是在IEnumerable上使用第一个还是第二个

我敢肯定,除了IEnumerable之外,不可能让第一个方法获取所有对象,所以还有其他方法吗?

不是真正的解决方案,但是注释太长了。希望有一位C规范大师会出现,告诉我们为什么重载解析在这种特殊情况下是这样工作的

如果

您可以限定equalityExpression的参数,或者 IEnumerable的内部类型可以从lambda表达式推断出来, 它应该可以很好地工作:

class Program
{
    static void Main(string[] args)
    {
        var array = new[] { 1, 2, 3 };

        // uses the IEnumerable overload -- prints false
        Console.WriteLine(array.HasChanged(array, (int x, int y) => x == y));

        // uses the IEnumerable overload -- prints false
        Console.WriteLine(array.HasChanged(array, (x, y) => x >= y));

        // uses the generic overload -- prints true
        Console.WriteLine(array.HasChanged(array, (x, y) => x == y));

        Console.ReadLine();
    }
}
static class Extensions
{
    public static bool HasChanged<T>(this IEnumerable<T> obj1, IEnumerable<T> obj2, Func<T, T, bool> isEqualExpression)
    { 
        return false; 
    }
    public static bool HasChanged<T>(this T obj1, T obj2, Func<T, T, bool> equalityExpression)
    { 
        return true; 
    }
}

如果第一个方法的主体是IEnumerable,您可以检查它是否为IEnumerable,然后调用第二个私有方法,那么您只需要一个。在两个方法上指定相同的名称对我来说非常好。您说过这目前不起作用。这是什么意思?你的错误是什么?或者意外的行为或什么?我很抱歉,我想我犯了一个错误,它确实在工作,Visual Studio IntelliSense让我认为它不工作。这绝对是你在那里发现的意外行为。@Andrew:的确,我本来会在最后一种情况下预料到重载解析模糊错误。如果数组是数组或列表,它按照您指定的方式工作。但是,如果在这些情况下,变量被声明为IEnumerable而不是使用var或List,则会出现歧义错误。这真的让人困惑。这也不是意料之中的,当你指定var时,编译器会假设类型是int[],最好的重载是泛型,当你推IEnumerable时,它是不明确的,因为它可以同时使用这两个重载。指定Func时,它由IEnumerable重载决定。