如果有2个具有相同签名的方法会发生什么。一个原生和第二个扩展方法?

时间:2012-09-18 11:22:34

标签: c# .net extension-methods

如果我创建一个与本机方法具有相同签名的扩展方法(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我做了

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

这会编译并运行,但它不会调用我的EM而是调用其本机方法。我相信它不会显示有2次重载,因为重载会导致signtaure发生一些变化

enter image description here

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

1 个答案:

答案 0 :(得分: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);
    }
}