繁体   English   中英

C#扩展方法优先级

[英]C# Extension method precedence

我对扩展方法的工作原理有点困惑。

如果我正确地阅读这个http://msdn.microsoft.com/en-us/library/bb383977.aspx并且这个如果扩展方法与密封类中的方法具有相同的签名,那么调用优先级是什么?

然后以下应该写出“实例”,而是写入“扩展方法”。

interface IFoo
{
}

class Foo : IFoo
{
    public void Say()
    {
        Console.WriteLine("Instance");
    }
}

static class FooExts
{
    public static void Say(this IFoo foo)
    {
        Console.WriteLine("Extension method");
    }
}

class Program
{
    static void Main(string[] args)
    {
        IFoo foo = new Foo();
        foo.Say();
    }
}

澄清澄清行为的任何帮助。

这里最大的区别是你已经为IFoo接口定义了一个扩展方法,你的foo变量是IFoo类型。

如果你的代码看起来像这样:

Foo foo = new Foo();
foo.Say()

将执行Foo.Say()方法,而不是扩展方法。

我希望我能给你一个彻底的解释,为什么这是,但我只能涵盖基本机制。 由于你的变量是IFoo类型而不是Foo ,当编译器试图确定哪些方法可用时,它看起来超过了Foo类的任何非接口方法(应该如此)。 但是,扩展方法Say()可用,因此它调用了它。

在你的Mainfoo被声明为IFoo 当编译器查找方法Say ,它只找到扩展方法。 这是因为实例方法是在Foo声明的,而不是在IFoo 编译器不知道变量foo碰巧包含Foo的实例; 它只是查看变量声明的类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM