2

如果我创建一个与本机方法具有相同签名的扩展方法 (EM),会发生什么。

我的场景
我创建了一个扩展方法

public static class EM
{
    public static void ForEach<T>(this List<T> enu, Action<T> action)
    {            
        foreach (T item in enu)
            action(item);
    }
}

现在由于 List 也有一个具有相同签名的函数

public void ForEach(Action<T> action);

所以对于列表我做了

List<Label> re = new List<Label>();
re.ForEach(x => Foo(x));

这会编译并运行,但它不会调用我的 EM,而是调用它的本机方法。我相信它不会显示有 2 个重载,因为对于重载,signtaure 必须有一些变化

在此处输入图像描述

查询
Q1。为什么会这样?
Q2。如果有更多参数,那么我可以更改参数顺序并调用它。但是我如何让他用相同数量的参数调用我的 EM(这是对我的问题的一个非常简单的解释。我的 EM 可能是一个复杂的问题)?

4

1 回答 1

4

C# 将始终调用类上的方法,而不是调用扩展方法。我建议在方法的名称中添加一些东西来区分它。我个人最后使用Ex,因为它很短并且提醒我它是一种扩展方法。

public static class EM
{
    public static void ForEachEx<T>(this List<T> enu, Action<T> action)
    {            
        foreach (T item in enu)
            action(item);
    }
}
于 2012-09-18T11:37:18.353 回答