c# - 什么时候可以说发生了方法组转换?

标签 c# .net delegates method-group

所以我不太确定何时可以安全地说发生了方法组转换。 我们在之前的帖子中有这个多播委托(delegate):

public partial class MainPage : PhoneApplicationPage
{
public delegate void MyDelegate(int a, int b);
// Constructor
public MainPage()
{
    InitializeComponent();

    MyDelegate myDel = new MyDelegate(AddNumbers);
    myDel += new MyDelegate(MultiplyNumbers);
    myDel(10, 20);
}

public void AddNumbers(int x, int y)
{
    int sum = x + y;
    MessageBox.Show(sum.ToString());
}

public void MultiplyNumbers(int x, int y)
{
    int mul = x * y;
    MessageBox.Show(mul.ToString());
}
}

我说方法组转换仅在我们分配了一个重载的方法时发生,并且至少有一个重载与委托(delegate)匹配。在这种情况下,没有方法组转换。

一位程序员同事说,如果您不认为 MyDelegate myDel = AddNumbers; (名字指的是问题)是一个方法组转换,那么它会是什么?

C# 语言规范:存在从方法组 (§7.1) 到兼容委托(delegate)类型的隐式转换 (§6.1)。给定一个委托(delegate)类型 D 和一个被归类为方法组的表达式 E,如果 [...]

那么哪种观点是正确的呢?

最佳答案

I say that a method group conversion only occurs when we have assigned a method thats overloaded

不,不需要为方法组转换重载(通过多个方法)。

任何时候你只有一个方法名,或者一个用目标限定的方法名(例如 MultiplyNumbersfoo.MultiplyNumbers),这就是一个方法组。如果您要将其转换为委托(delegate)实例,那就是方法组转换。

编辑:在 7.1 中引起问题的规范部分是这样的:

A method group, which is a set of overloaded methods resulting from a member lookup (7.4).

“重载方法集”可以是大小为 1 的集合——它仍然是一个方法组。

这是由 7.6.5.1(方法调用)支持的 - 强调我的:

For a method invocation, the primary-expression of the invocation-expression must be a method group. The method group identifies the one method to invoke or the set of overloaded methods from which to choose a specific method to invoke.

这清楚地表明,具有一个元素的方法组是一个有意义的概念。

关于c# - 什么时候可以说发生了方法组转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15024743/

相关文章:

c# - 线程循环,以最佳方式关闭它

c# - 启用复制的通用应用程序 Windows Phone TextBox.SelectAll() 不起作用

.net - 如何将资源嵌入到 .NET PE 可执行文件中?

c# - 连接到 SignalR 服务器

c# - 有没有办法将函数及其参数存储在变量中以供以后调用?

ios - 为什么我的标签栏 Controller 从与事件 View Controller 不同的 View Controller 执行代码?

c# - 无效的匿名类型成员声明符

c# - 跨平台开发

c# - 为什么委托(delegate)实例不总是被缓存?

c# - 如何将 XAML 转换为纯 C#?