4

記事「匿名メソッド」(記事シリーズ「C#3.0のデリゲートとラムダ式」の一部として) を読んだ後、次のフレーズを使用します。

  • "高度なトピック:パラメータのない匿名メソッド

    ...匿名メソッドはパラメータリストを省略できます(delegate { return Console.ReadLine() != ""}たとえば)。これは非定型ですが、デリゲートタイプが異なる場合でも、同じ匿名メソッドを複数のシナリオで表示できます"*

少し戸惑いました。

IMO(現在は見つかりませんが、私が覚えている限り)、型はパラメーターリストによって決定されますが、メソッドの戻り型によっては決定されません。それが正しいか?

では、パラメーターなしのメソッドまたはデリゲートのタイプはどのように異なるのでしょうか。

同じ匿名メソッドの異なるパラメーターなしのデリゲートタイプを示す(可能な限り単純な)コード例をいただければ幸いです。

4

1 に答える 1

6

パラメータ リストが異なっていてはなりません。ただし、無名メソッドでは、パラメーター リストを完全に省略してもかまいません。コンパイラは、パラメーター リストがどのように見える必要があるかを既に認識しているため、それを記述する必要はありません。もちろん、パラメータを使用する場合 (通常はそうです)、パラメータを指定して名前を付ける必要があります。

これは次のことを示していると思います。

internal delegate void NoParameters();

internal delegate void SomeParametersThatYouMightNotUse(int i, ref string s, Uri uri);

次に、以下が合法です。

NoParameters f = delegate { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate { Console.WriteLine("Hello"); };

( ... )keyword の後に括弧がないことに注意してくださいdelegate

ただし、括弧内のパラメーターを指定する場合は、もちろん、型と一致する必要があります。

NoParameters f = delegate() { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate(int i, ref string s, Uri uri) { Console.WriteLine("Hello"); };

いずれの場合も、デリゲートを呼び出すときは、正しいパラメーターを使用してください。

f();

string myString = "Cool";
g(42, ref myString, new Uri("http://stackoverflow.com/"));

この点で、ラムダ式の構文は少し異なります。パラメータは省略できません。ただし、多くの場合、パラメーターの型は省略できます。また、パラメーターが 1 つだけあり、その型を省略した場合は、括弧も省略できます。

于 2013-02-13T09:06:48.650 に答える