2012-12-10 4 views
13

ラムダ式の引数を破棄することは可能ですか? など。私は、アクション< int型を渡す必要が>をint型が、私は第二のparamで唯一の興味が、私はそれが機能している最初のケースでC#ラムダ名前のないパラメータ

(_, foo) => bar(foo) 
// or 
(, foo) => bar(foo) 

のようなものを書きたいです。しかし、最初のパラメータは名前が "_"であるため実際には名前が付けられません。だから私は2つ以上を破棄したいときには機能しません。私はプロローグで「任意の価値」という意味を持つため、_を選択します。

So.私のユースケースに特別な文字や表現はありますか?

答えて

8

いいえ、できません。 C# language specificationの文法を見ると、明示的と暗黙的の2つの方法でlambdaを宣言できます。どちらもパラメータの識別子をスキップしたり、識別子(名前)を再利用することはできません。

explicit-anonymous-function-parameter: 
    anonymous-function-parameter-modifieropt type identifier 

implicit-anonymous-function-parameter: 
    identifier 

通常の関数の未使用関数のパラメータと同じです。彼らには名前を付ける必要があります。

有効なC#の名前であるであるため、_をパラメータの名前として使用できますが、特別な意味はありません。

C#7以降では、_は、が特別な意味を持ちます。ラムダ式のパラメータ名ではなく、パターンマッチング、分解、アウト変数、さらには通常の割り当てなど、他のものに対しても間違いありません。たとえば、_と宣言することなく_ = 5;を使用できます。

+2

'_ C#7ではラムダ式のパラメータ名(私が知る限り)ではなく、パターンマッチング、分解、出力変数、さらには通常の割り当てのような他のものに対しても特別な意味を持ちます。 (例えば、_ = 5;を '_'を使わずに使うことができます。)この答えはC#7より数年前に書かれたものですが、最後の行が間違っているとすれば、これを編集すると良いでしょうあなたには時間があります。 –

+1

@JonSkeet気づいてくれてありがとう、私はあなたのコメントを編集に加えました。私は未来を予測する上でより良くなる必要があります。 –

+0

私はしばしば同じ立場にいます - この場合、私は実際にはそれが古い回答であることに気づいていませんでした...新しい答えが第一面に質問を載せました。 –

5

短い答えは:いいえ、すべてのパラメータに名前を付ける必要があり、名前は一意でなければなりません。

_は、C#で有効な識別子であるため、1つのパラメータ名として使用できます。
ただし、1度しか使用できません。

+4

私はしばしば '(_、___、foo)=> {...}' – Basic

0

C#7では、破棄を使用できます。破棄は、読み込みできない書き込み専用の変数です。それは基本的にあなたが使用したくない変数のためです 詳細here

+1

これは本当であり、他の答えでは見逃されていますが、ラムダ式のパラメータの場合は、私が知る限りは関係ありません。 (例えば、 '(_、_、x)=> x'は使用できません) –

+0

@JonSkeetこれは使えませんか? (_、foo)=> bar(foo) –

+1

できますが、 '_'は通常のパラメータです。 '(_、_、x)'を使うことはできません。同じパラメータを2回宣言するからです。 (パターンで '_'を複数回使用できるのに対して) –

関連する問題