何时说方法组转换是否有效?

时间:2013-02-22 12:54:21

标签: c# .net delegates method-group

所以我真的不相信何时可以说方法组转换发生了。 我们从以前的帖子中获得了这个多播委托:

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,如果[...]

,则存在从E到D的隐式转换。

所以这个观点是正确的吗?

3 个答案:

答案 0 :(得分:4)

  

我说只有在我们分配了一个重载的方法

时才会发生方法组转换

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

只要您获得方法名称或使用目标限定的方法名称(例如MultiplyNumbersfoo.MultiplyNumbers),这就是方法组。如果您要将其转换为委托实例,那就是方法组转换。

编辑:引起问题的规范部分是7.1:

  

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

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

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

  

对于方法调用, invocation-expression primary-expression 必须是方法组。方法组标识要调用的一个方法或一组重载方法,从中选择要调用的特定方法。

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

答案 1 :(得分:3)

方法组转换与重载无关。不要被“method group ”弄糊涂。这并不意味着必须不止一个。

答案 2 :(得分:1)

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