2

だから私は2つの異なる方法があります。

1つは通常の方法です

void DoSomething(delegate x)
{
     foreach(......)
     { x(); }
}

もう1つは、部分的ですが実装されていないものです

partial void DoWorkInForEach();

このように最初のメソッドを呼び出すと

DoSomething(DoWorkInForEach);

何が起こりますか、デリゲートパラメータはnullになりますか、メソッド呼び出し全体が削除されますか?

4

2 に答える 2

4

言語仕様から:

10.2.7部分メソッド

[...]

部分メソッドMに対して、定義宣言が指定されているが実装宣言が指定されていない場合、次の制限が適用されます。

メソッドへのデリゲートを作成するのはコンパイル時エラーです(§7.6.10.5)。

•式ツリータイプ(§6.5.2)に変換される無名関数内でMを参照することはコンパイル時エラーです。

•Mの呼び出しの一部として発生する式は、明確な割り当て状態(§5.3)に影響を与えないため、コンパイル時エラーが発生する可能性があります。

•Mをアプリケーションのエントリポイントにすることはできません(§3.1)。

必要に応じて、メソッドグループの代わりにラムダをここで使用できます。これにより、基本的に操作なしのデリゲートが提供されます。

DoSomething(() => DoWorkInForEach());
于 2013-02-28T15:25:43.500 に答える
1

仮説

MSDNによると:

定義および実装された部分メソッドへのデリゲートを作成できますが、定義されただけの部分メソッドへのデリゲートは作成できません。

また、C#言語仕様

部分メソッドMに対して定義宣言が指定されているが、実装宣言が指定されていない場合、次の制限が適用されます。メソッドへのデリゲートを作成するのはコンパイル時エラーです(§7.6.10.5)。


以下は正しいです:

partial class Foo
{
    partial void Method();

    Foo()
    {
        Action action = new Action(Method);
    }
}

partial class Foo
{
    partial void Method()
    {
        // ...
    }
}

そして、以下はコンパイルエラーをスローします:

メソッド'Test.Foo.Method()'からデリゲートを作成できません。これは、実装宣言のない部分的なメソッドであるためです。

partial class Foo
{
    partial void Method();

    Foo()
    {
        Action action = new Action(Method); // Compilation error
    }
}
于 2013-02-28T15:22:31.443 に答える