C#如何解析扩展方法调用?

时间:2011-07-27 07:50:16

标签: c# extension-methods overloading resolution

我的问题部分在this answer中得到解答。

然而,还有另一种情况:

public class A { }

public static class ExtendedA
{
    public static void Ext(this A a) { }
}

public static class ExtendedB
{
    public static void Ext(this A a) { }
}

public static class App
{
    public static void Main()
    {
        A a = new A();
        a.Ext();
    }
}

C#编译器如何选择调用方法?

4 个答案:

答案 0 :(得分:3)

如果您尝试在同一名称空间中编译所有代码,则会在a.Ext()上收到编译器错误,指出Ext是一个无法解析的模糊函数调用。为了解决这个错误,你要么必须将扩展类移动到不同的名称空间中,只导入其中一个,要么将该方法作为常规静态名称调用。

作为您问题的直接答案:C#编译器选择。它迫使你去。

答案 1 :(得分:2)

它没有 - 如果调用完全不明确,则会出现编译器错误CS0121:

  

以下方法或属性之间的调用不明确:'ExtendedA.Ext(A)'和'ExtendedB.Ext(A)'

答案 2 :(得分:2)

如果您尝试自己的代码,则会出现以下错误:

错误1以下方法或属性之间的调用不明确:'ConsoleApplication3.ExtendedA.Ext(ConsoleApplication3.A)'和'ConsoleApplication3.ExtendedB.Ext(ConsoleApplication3.A)'c:\ temp \ trash \ ConsoleApplication3 \ ConsoleApplication3 \ Program.cs 28 4 ConsoleApplication3

很明显,编译器尝试解决正确的调用问题,就像它对重载一样,但最终放弃了,因为有两种方法引起歧义。

所以,似乎它试图解决就像重载方法一样。

答案 3 :(得分:1)

您不能添加具有相同签名的2个扩展函数,因为这会导致歧义错误,因为编译器无法区分使用哪个。