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

3

我的问题的一部分在这个答案中得到了解答。

但是,还有另一种情况:

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

@Jamiec:是的,你可以这样做。这个问题涉及到扩展方法,而这正是它们的工作原理。 - Ian
1
我想它不会编译,因为调用将在这两者之间产生歧义。 - Ian
请参见https://dev59.com/SW435IYBdhLWcg3wrSBB。 - linepogl
@V4Vendetta:看起来我的代码出错了...不知怎么回事,我把调用排除在外,所以没有收到编译器的错误提示。 - Kornelije Petak
-1:您的问题无效。代码甚至无法编译。您本可以自己检查一下的。 - Daniel Hilgarth
我意识到了我的错误。投票关闭。 - Kornelije Petak
4个回答

4
如果您试图在同一命名空间中编译所有代码,您将在 a.Ext() 上收到编译器错误,指出Ext 是一个无法解析的模糊函数调用。为了解决此错误,您需要将扩展类移动到不同的命名空间并仅导入其中一个,或者将该方法作为常规静态方法调用。
直接回答您的问题:C# 编译器 不会 选择。它强制您选择。

2
如果调用完全不明确,就会出现编译器错误CS0121:

该调用在以下方法或属性之间模棱两可:'ExtendedA.Ext(A)' 和 'ExtendedB.Ext(A)'


2
如果您尝试自己的代码,会出现以下错误:
错误1:调用'ConsoleApplication3.ExtendedA.Ext(ConsoleApplication3.A)'和'ConsoleApplication3.ExtendedB.Ext(ConsoleApplication3.A)'两个方法或属性不明确。c:\temp\trash\ConsoleApplication3\ConsoleApplication3\Program.cs 28行4列 ConsoleApplication3
很明显编译器试图像处理重载方法一样解决正确的调用,但最终因为两个方法引起了歧义而放弃。
所以,看起来它试图像处理重载方法一样解决问题。

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接