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

メソッド グループの変換は、オーバーロードされたメソッドを割り当て、少なくとも 1 つのオーバーロードがデリゲートと一致する場合にのみ発生します。この場合、メソッド グループの変換はありません。

仲間のプログラマーは、MyDelegate myDel = AddNumbers; (質問を参照する名前で)はメソッドグループの変換ですが、それは何ですか?

C# 言語仕様: メソッド グループ (§7.1) から互換性のあるデリゲート型への暗黙的な変換 (§6.1) が存在します。デリゲート型 D と、メソッド グループとして分類される式 E が与えられた場合、E から D への暗黙的な変換が存在する場合 [...]

では、どの観点が正しいのでしょうか。

4

3 に答える 3

4

メソッドグループの変換は、オーバーロードされたメソッドを割り当てた場合にのみ発生すると言います

いいえ、メソッドグループの変換に(複数のメソッドによる)オーバーロードの要件はありません。

メソッド名だけ、またはターゲット(MultiplyNumbersまたはfoo.MultiplyNumbers)で修飾されたメソッド名がある場合は常に、それがメソッドグループです。これをデリゲートインスタンスに変換する場合、それはメソッドグループの変換です。

編集:問題を引き起こしている仕様のセクションはこれです、7.1で:

メソッドグループ。これは、メンバールックアップ(7.4)の結果としてオーバーロードされたメソッドのセットです。

その「オーバーロードされたメソッドのセット」はサイズ1のセットである可能性があります-それはまだメソッドグループです。

これは7.6.5.1(メソッド呼び出し)によってバックアップされます-強調鉱山:

メソッド呼び出しの場合、invocation- expressionのprimary-expressionはメソッドグループである必要があります。メソッドグループは、呼び出す1つのメソッド、または呼び出す特定のメソッドを選択するためのオーバーロードされたメソッドのセットを識別します。

これは、1つの要素を持つメソッドグループが意味のある概念であることを明確にしています。

于 2013-02-22T12:56:58.623 に答える
3

メソッドグループの変換は、オーバーロードとは何の関係もありません。「メソッドグループ」に惑わされないでください。それはそれが複数でなければならないという意味ではありません。

于 2013-02-22T12:56:52.613 に答える
1

少なくとも 1 つのオーバーロードがデリゲートに一致するメソッド割り当てました - たまたまオーバーロードが 1 つしかありません。new MyDelegate「変換」のポイントは、明示的に構築する必要がなく、コンパイラがビットを推測できるということです。

于 2013-02-22T12:58:12.743 に答える