2013-01-10 11 views
20

lambda expressionsoptional arguments(デフォルトパラメータ)を使用する方法はありますか?私はドキュメンテーションを読んだことがありますが、どちらか一方の言い方をすることはできません。 c#のラムダ式で省略可能な/省略可能なパラメータを使用することはできますか?

は、私はそうのようなデフォルト値を提供するオプションの引数を使用して簡単な方法を定義することができ、説明するために:私は、ラムダを使用して同じことを行うことができていた場合

void MyMethod(string arg = "default-value") 
{ 
    Console.WriteLine(arg); 
} 

私が知りたいことはあります表現。

// gives a syntax error 
Action<string> MyMethod = (arg = "default") => Console.WriteLine(arg); 

デリゲートを使用してデフォルト値でオプションのパラメータで作業することはできますが、これはちょっと面倒なようです。

delegate void MyDelegate(string arg = "default"); 
MyDelegate MyMethod = arg => Console.WriteLine(arg); 

また私は、ラムダ本体に何かのようにパラメータをチェックすることができ...

Action<string> MyMethod = (arg) => Console.WriteLine(string.IsNullOrEmpty(arg) ? 
            "default" : 
            arg); 

しかし、再び、これは少し不器用なようです。

オプションのパラメータを使用して、C#でラムダ式のデフォルト値を設定することはできますか?

+0

[オプションのパラメータを引数としてメソッドを渡す方法は?](http://stackoverflow.com/questions/12728844/how-to-pass-a-method-with-optional-parameters-as) -an-argument) – horgh

+0

それは意味をなさない。とにかく引数なしで 'Action 'を呼び出すことはできません。 – SLaks

+1

@ ConstantinVasilcov - それはまったく重複していません - 私はラムダ式について簡単に質問しています - 単純な方法ではありません。私はそれを明確にしたと思った、申し訳ありません。 – Fraser

答えて

21

いいえ呼び出し元(デリゲートを呼び出すコード)はラムダ式を「認識」しません。そこで、デフォルトのパラメータを指定するのは意味がありません。呼び出し元にはすべて代理人が表示されます。たとえば、呼び出しコードは約Action<string>を知っています - ラムダ式で指定されたデフォルト値を提供することをコンパイラがどのように知っていますか?

どのように扱いにくいかの例として、であるかどうかを考えてみましょう。そして、このコードを考えてみましょう。

引数は呼び出しサイトでコンパイラ によって提供されていることを念頭に
Action<string> action; 
if (DateTime.Today.Day > 10) 
{ 
    action = (string arg = "boo") => Console.WriteLine(arg); 
} 
else 
{ 
    action = (string arg = "hiss") => Console.WriteLine(arg); 
} 
action(); // What would the compiler do here? 

ベア - それが最終ラインで何をすべきでしょうか?

これはインターフェイスと実装を持つようなものです。インターフェイスにデフォルトのパラメータがある場合は問題ありません。実装上しか持っていなければ、特定の実装を知っている呼び出し側だけがそれを見ることができます。ラムダ式の場合、呼び出し側が使用する目に見える実装は実際にはありません。デリゲートの署名だけです。

+0

+1ありがとうございます、それは理にかなっています。私は本当に何かをしようとしていましたが、最初はうまくいくようでした... – Fraser

2

ラムダは、それが割り当てられたデリゲートの署名が何であれ一致します。代理人に割り当てられることなく、ラムダはコンパイルできません。

デリゲートにオプションの引数が含まれている場合、そのデリゲートを使用すると引数をオプションで指定できます。デリゲートがそうでなければ、そのデリゲートの使用は引数を省略できません。

ActionFunc代理人は非常に便利で、ほとんどの署名を表すことができますが、任意の署名で任意の引数を表すことはできません。そのために別のデリゲート定義を使用する必要があります。

Remeber、ActionおよびFuncは、特別なものではなく、すべての人が使用する2人の代理人であり、小さなものごとに自分自身を作成することを心配する必要はありません。

関連する問題