我的问题部分在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#编译器如何选择调用方法?
答案 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个扩展函数,因为这会导致歧义错误,因为编译器无法区分使用哪个。