gpt4 book ai didi

c# - 将扩展方法传递给需要委托(delegate)的方法。这是如何运作的?

转载 作者:可可西里 更新时间:2023-11-01 08:41:42 26 4
gpt4 key购买 nike

所以在工作中我使用了一个我们没有编写的 API,其中一个方法采用了委托(delegate)。出于某种原因,我想到了一个适合该签名的扩展方法,所以我想知道它是否可行。我确信它不会,但令我惊讶的是,它确实发生了。请允许我演示:

假设我有这些类(class):

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)
{

}

现在我的扩展方法(看起来像)与那个签名匹配,但我们都知道扩展方法只是虚幻,所以它真的不与那个签名匹配。然而,我可以安全地这样做:

var instance = new MyClass();
Method(instance.FuncMethod);

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

最佳答案

实例方法被实现为采用隐藏的this参数。

当您从扩展方法创建实例委托(delegate)时,隐藏的 this 参数将作为第一个普通参数传递给该方法。

Note that this cannot be done with value types .

关于c# - 将扩展方法传递给需要委托(delegate)的方法。这是如何运作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3284869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com