3

因此,当可以安全地说发生方法组转换时,我并不真正相信。我们从上一篇文章中得到了这个多播委托:

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());
}
}

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

一位程序员同行说,如果你不认为 MyDelegate myDel = AddNumbers; (名称指问题)是方法组转换,那会是什么呢?

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

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

4

3 回答 3

4

我说只有当我们分配了一个重载的方法时才会发生方法组转换

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

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

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

方法组,它是由成员查找 (7.4) 产生的一组重载方法。

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

这得到了 7.6.5.1(方法调用)的支持——强调我的:

对于方法调用,调用表达式的主表达式必须是方法组。方法组标识要调用的一个方法或一组重载方法,从中选择要调用的特定方法。

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

于 2013-02-22T12:56:58.623 回答
3

方法组转换与重载无关。不要被“方法”所迷惑。这并不意味着它必须不止一个。

于 2013-02-22T12:56:52.613 回答
1

已经分配了一个方法,其中至少有一个重载与委托匹配 - 碰巧只有一个重载。“转换”的重点只是编译器可以推断出该new MyDelegate位,而不是您需要显式构造它。

于 2013-02-22T12:58:12.743 回答