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

C#如何解析扩展方法调用?,c#,extension-methods,overloading,resolution,C#,Extension Methods,Overloading,Resolution,我问题的这一部分已在中得到回答 然而,还有另一种情况: 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 M

我问题的这一部分已在中得到回答

然而,还有另一种情况:

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#编译器如何选择要调用的方法?

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

直接回答你的问题:C#编译器不会选择。它强制您执行。

它不执行——如果调用完全不明确,则会出现编译器错误CS0121:

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


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

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

很明显,编译器试图解决正确的调用,就像解决重载一样,但最终放弃了,因为有两种方法导致了歧义


因此,它似乎试图解决重载方法的问题。

您不能添加两个具有相同签名的扩展函数,因为这将导致一个模糊错误,因为编译器无法区分要使用哪个扩展函数。

@Jamiec:可以,问题是关于扩展方法的,这正是它们的工作方式。我想它不会编译,因为调用在这两者之间是不明确的。请参阅@V4Vendetta:似乎我在代码中犯了一个错误。。。我不知何故排除了调用,所以我没有收到编译器的错误。-1:你的问题是无效的。代码甚至都没有编译。你可以自己检查一下。