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:你的问题是无效的。代码甚至都没有编译。你可以自己检查一下。