c# - 方法名称是否隐式转换为委托(delegate)类型?

标签 c# delegates

我在理解委托(delegate)方面有点困难。

我有一个委托(delegate),当输入 y 字符时我将调用它:

public delegate void respondToY(string msgToSend);

        private respondToY yHandler;

我有一个订阅方法,以便调用代码可以要求在调用委托(delegate)时得到通知:

public void Subscribe(respondToY methodName)
        {
            yHandler += methodName;
        }

据我所知,要向该委托(delegate)注册,我需要提供 respondToY 类型的内容。然而,当调用订阅方法时,我可以提供委托(delegate)的新实例或只是方法的名称。这是否意味着可以使用任何与委托(delegate)签名匹配的方法并将自动转换为正确的委托(delegate)类型?

** 编辑 **

因此,在这个假设下,仅向按钮的单击事件处理程序提供方法名称也是有效的(前提是该方法接受发送者和相关事件对象),它会被转换为所需的委托(delegate)?

最佳答案

这是一个方法组转换。它将方法组(基本上是方法或重载方法的名称)转换为具有兼容签名的委托(delegate)类型的实例。

是的,可以使用任何兼容的方法。请注意,您也可以提供目标 - 例如:

string text = "Hello there";
Func<int, int, string> func = text.Substring;

Console.WriteLine(func(2, 3)); // Prints "llo", which is text.Substring(2, 3)

虽然必须涉及特定的委托(delegate)类型。你不能只使用:

Delegate x = methodName;

...编译器不知道要创建的委托(delegate)类型。

有关详细信息,请参阅 C# 4 语言规范的第 6.6 节。

请注意,方法组转换总是会创建有问题的委托(delegate)的新实例 - 它不会被缓存(并且不可能在不违反规范的情况下缓存。)

关于c# - 方法名称是否隐式转换为委托(delegate)类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5767427/

相关文章:

c# - NLog多实例,如何?

c# - wcf web.config 文件

c++ - 如何为 QTreeWidget 创建委托(delegate)?

iphone - SKProductsRequest 委托(delegate)方法永远不会被调用

c# - 如何通过多个接口(interface)协变 "carry"

c# - Outlook Com 未注册

c# - 使用增量数字作为 GetHashCode 返回值

Windows 窗体线程和事件 - ListBox 及时更新,但进度条遇到巨大延迟

objective-c - 在委托(delegate)中初始化自定义对象

ios - 使用 KVO 与 NSNotificationCenter 观察可变数组的变化