C# 将扩展方法传递给需要委托的方法。这是怎么回事?

C# 将扩展方法传递给需要委托的方法。这是怎么回事?,c#,delegates,extension-methods,C#,Delegates,Extension Methods,所以在工作中,我使用了一个我们没有编写的API,其中一个方法接受了委托。出于这样或那样的原因,我想到我有一个适合这个签名的扩展方法,所以我想知道它是否能工作。我相信不会的,但令我惊讶的是,它做到了。请允许我演示: 假设我有这些课程: public interface IMyInterface { } public class MyClass : IMyInterface { } public static class Extensions { public static st

所以在工作中,我使用了一个我们没有编写的API,其中一个方法接受了委托。出于这样或那样的原因,我想到我有一个适合这个签名的扩展方法,所以我想知道它是否能工作。我相信不会的,但令我惊讶的是,它做到了。请允许我演示:

假设我有这些课程:

public interface IMyInterface
{

}

public class MyClass : IMyInterface 
{ 

}

public static class Extensions
{
    public static string FuncMethod(this IMyInterface imy, int x)
    {
        return x.ToString();
    }
}
现在假设我在某个地方有一个方法签名,如下所示:

    private static void Method(Func<int, string> func)
    {

    }

我的问题是,这是如何工作的?编译器为我生成了什么使这一点可以接受。扩展方法的实际签名采用了
IMyInterface
的一个实例,但是
Func
没有,所以在幕后发生了什么事?

实例方法被实现为采用hidden
这个
参数

从扩展方法创建实例委托时,hidden
this
参数将作为第一个普通参数传递给该方法


.

我不知道编译器到底在做什么来允许这些场景,但预期似乎是合理的。也许这个代码示例将有助于理解这个概念

MyClass instance = new MyClass();
Func<int, string> f1 = instance.FuncMethod;
Func<int, string> f2 = (i) => instance.FuncMethod(i);
Func<int, string> f3 = (i) => Extensions.FuncMethod(instance, i);
MyClass实例=新建MyClass();
Func f1=instance.FuncMethod;
Func f2=(i)=>instance.FuncMethod(i);
Func f3=(i)=>Extensions.FuncMethod(实例,i);
Extensions.FuncMethod(实例,i)
显示最终如何调用委托。
MyClass instance = new MyClass();
Func<int, string> f1 = instance.FuncMethod;
Func<int, string> f2 = (i) => instance.FuncMethod(i);
Func<int, string> f3 = (i) => Extensions.FuncMethod(instance, i);