如果我创建一个与本机方法具有相同签名的扩展方法(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发生一些变化
查询
Q1。为什么会这样?
Q2。如果有更多参数,那么我可以更改参数顺序并调用它。但是如何让他用相同数量的参数调用我的EM(这是对我的问题的一个非常简单的解释。我的EM可能是一个复杂的)?
答案 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);
}
}