重载通用扩展方法

时间:2014-12-30 11:50:16

标签: 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<T> obj2, Func<T, T, bool> isEqualExpression)

但是我想给它们两个相同的名字,这些名字当前不起作用,因为IEnumerables也是对象,所以编译器无法决定是否在IEnumerable上使用第一个或第二个。

我确信,不可能让第一个方法占用所有对象但是IEnumerable,那么还有另外一种方法吗?

1 个答案:

答案 0 :(得分:4)

(不是一个真正的解决方案,但是对于评论来说太长了。希望其中一个C#规范大师会出现并告诉我们为什么在这种特殊情况下重载解析会像这样工作。) < / p>

如果

  • 您对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; 
    }
}