0
I am trying to learn the anonymous method and tried out this sample.

したがって、WriteLog関数を呼び出そうとするときはいつでも使用できます

()=> { return "someLogData" };

利点は、別の関数を用意する必要がなく、コード行を節約できることです。

    public void WriteLog(Func<string> s)
    {
        Console.WriteLine(s);
    }

しかし、同じことは次のような関数ではうまくいきません

Console.WriteLine( ()=> {return "someString" } );

.NET がこの匿名メソッド機能を提供しているのに、独自のメソッドで使用できないのはなぜですか?

4

3 に答える 3

2

Console.WriteLine-を受け入れるオーバーロードはありませんFunc<string>。実際、現在のメソッドでさえ、何も役に立ちWriteLogません(デリゲートを呼び出す必要があるため)。

特定のデリゲートを受け入れるメソッド存在する場合 (最も顕著なのは LINQ ですが、他の場所でも同様です)、実際にラムダ式または匿名メソッドを使用してそれらを呼び出すことができます。

ラムダ式を使用して呼び出すことはできConsole.WriteLineますが、特定のデリゲート型にキャストする必要があります。これは、ラムダ式から特定のデリゲートまたは式の型への変換のみがあり、Delegateorだけではないためobjectです。したがって、これは機能します:

Console.WriteLine((Func<string>)(() => "someLogData"));

繰り返しになりますが、とにかくそうしても役に立ちません。デリゲートをログに記録するのではなく、デリゲートを呼び出した結果をログに記録する必要があります。

デリゲート IMO を受け入れることはあまり意味がありませConsole.WriteLineんが、実際にログに書き込む場合を除き、文字列を評価したくない、より柔軟なロギングにはより意味があります。

WriteLog呼び出し自体も簡単になることに注意してください。

WriteLog(() => "someLogData");
于 2013-08-05T10:09:55.603 に答える