什么时候可以说方法组转换已经发生
本文关键字:转换 可以说 方法 什么时候 | 更新日期: 2023-09-27 18:00:28
所以我真的不相信什么时候可以安全地说发生了方法组转换。我们有这个来自上一篇文章的多播委托:
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的隐式转换
那么,哪种观点是正确的呢?
我说,只有当我们分配了一个过载的方法时,才会发生方法组转换
不需要,方法组转换不需要重载(通过多个方法)。
任何时候,只要有一个方法名称,或者一个用目标限定的方法名称(例如MultiplyNumbers
或foo.MultiplyNumbers
),那就是一个方法组。如果您要将其转换为委托实例,那么这就是方法组转换。
编辑:造成问题的规范部分是这样的,在7.1中:
一个方法组,它是由成员查找(7.4)产生的一组重载方法。
这个"重载方法集"可以是一组大小为1的方法,它仍然是一个方法组。
这得到了7.6.5.1(方法调用)的支持-强调矿:
对于方法调用,调用表达式的主表达式个方法或从中选择要调用的特定方法的重载方法集。
这清楚地表明,具有一个元素的方法组是一个有意义的概念。
方法组转换与重载无关。不要被"方法组"弄糊涂。这并不意味着它必须不止一个。
您已经分配了一个方法,其中至少有一个重载与委托匹配-恰好只有一个重载。"转换"的要点只是编译器可以推断new MyDelegate
位,而不需要显式地构造它。