方法名是否隐式转换为委托类型

本文关键字:类型 转换 是否 方法 | 更新日期: 2023-09-27 17:53:08

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

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

public delegate void respondToY(string msgToSend);
        private respondToY yHandler;

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

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

据我所知,要注册这个委托,我需要提供respondToY类型的东西。然而,在调用subscribe方法时,我可以提供委托的新实例,也可以提供方法的名称。这是否意味着任何与委托签名匹配的方法都可以使用,并将自动转换为正确的委托类型?

**编辑

所以在这个假设下,为按钮的click事件处理程序提供方法名也是有效的(如果方法接受发送者和相关事件对象),它将被转换为所需的委托?

方法名是否隐式转换为委托类型

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

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

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 x = methodName;

…编译器不知道要创建什么样的委托。

有关更多信息,请参见c# 4语言规范的第6.6节。

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

据我所知…是的,委托类型只是确保签名匹配