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

时间:2011-04-23 22:36:01

标签: c# delegates

我在理解代表方面遇到了一些麻烦。

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

public delegate void respondToY(string msgToSend);

        private respondToY yHandler;

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

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

据我所知,要注册这个代表,我需要提供一些responseToY类型的东西。然而,当调用subscribe方法时,我可以提供委托的新实例或简单地提供方法的名称。这是否意味着可以使用与委托签名匹配的任何方法,并自动将其转换为正确的委托类型?

**编辑**

因此,基于此假设,仅为按钮的单击事件处理程序(如果方法采用发件人和相关事件对象)提供方法名称也是有效的,它将转换为所需的委托?

2 个答案:

答案 0 :(得分:9)

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

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

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节。

请注意,方法组转换始终会创建相关委托的新实例 - 它不会被缓存(并且不能违反规范。)

答案 1 :(得分:2)

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