C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■90425 / )  Re[3]: 引数のあるメソッドをメソッドに渡す
□投稿者/ 魔界の仮面弁士 (2094回)-(2019/03/09(Sat) 22:26:39)
No90412 (B.B さん) に返信
> しかしデリゲードはなかったことにしろという文言をよく見かけます

Delegate 型を無くしたらイベントすら扱えなくなりますよね。
delegate キーワードのことを言っているのでしょうか。

一応、解決済みマークはつけたままの状態にしておきますが、
前後の文脈が気になるので、具体的にどこに記載されていたのかを教えて欲しいです。


もしもそれが、
 SimpleFunc f1 = i => i * 2;
と書けるようになったので、C# 2.0 時代のような
 SimpleFunc f1 = delegate(int i) { return i * 2; };
の形式で記述する必要はもはや無くなった…という意味で
書かれているのだとしたら、それはその通りだと思います。

ただしラムダ式では、デリゲートと同じシグネチャが求められるので、
 button1.Click += (sender, e) => { label1.Text += "x"; };
を、たとえ引数が不要だったとしても、
 button1.Click += () => { label1.Text += "x"; }; // これは NG
のように書くことはできないという制限があるのに対し、
delegate キーワードであれば、
 button1.Click += delegate { label1.Text += "x"; };
のように、引数付きのデリゲートに引数無しの匿名関数を
割り当てることが可能という違いはあったりします。



> #90396で教えていただいた
> isSuccessful = hogeMethod(() => Method3("ほげほげ"));
> のようなラムダ式での記述の仕方を教えて欲しいのです

『() => Method3("ほげほげ")』の部分が「ラムダ式」ですね。



No90417 (B.B さん) に返信
> delegate int SimpleFunc(int x);
> この記述を書きたくないということでした。

えぇと…それはラムダ式とは関係ないです。(^_^:
Func<,> はジェネリックなデリゲート型ですね。


ラムダ式とは C# 3.0 で追加された構文で、先の例で言えば
複数行ラムダ構文の
  (int i) => { i = i * 2; return i * 2; }
や、あるいはより単純な単行ラムダ構文の
  i => i * 2;
などの表記を指します。


ラムダ式を受け取る変数の型は、Delegate もしくは Expression に限られます。

static void Main()
{
 // デリゲート型に対して、匿名メソッド式を代入
 Func<int, int> x = delegate (int i) { return i * 2; };

 // デリゲート型に対して、ラムダ式を代入
 Func<int, int> y = i => i * 2;

 // Expression 型に対して、ラムダ式を代入
 Expression<Func<int, int>> z = i => i * 2;

 // ローカル関数の宣言
 int f1(int i) { return i * 2; }

 // ローカル関数の宣言(式形式)
 int f2(int i) => i * 2; // これはラムダ式ではない
}



ラムダ式は、デリゲートに対して代入すると匿名メソッド式として扱われ、
Expression 型の変数に代入した場合は式木 (expression tree) となるため、
ラムダ式を代入する変数を
 var z = (int i) => i * 2;
のように型推論で宣言することはできません。


「=>」はラムダ演算子と呼ばれていましたが、C# 6.0 以降では
ラムダ式だけでなく、式形式のメンバー定義にも使われるようになりました。
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/lambda-operator
解決済み
返信 編集キー/


管理者用

- Child Tree -