6

学校に戻って、中括弧がすべての式を実行し、最後の値を返すというデフォルトの動作を持つコンパイラを作成しました...したがって、次のように書くことができます:

int foo = { printf("bar"); 1 };

C#に同等のものはありますか? たとえば、副作用のあるラムダ関数を書きたいとします。

ラムダの副作用(単なる例)についてではなく、この機能があればもっと重要です...たとえば、lispでは、prognがあります

4

5 に答える 5

7

原則として、Vlad からの回答は正しく、事前にラムダ関数をデリゲートとして宣言する必要はありません。

ただし、C# では状況はそれほど単純ではありません。コンパイラは、構文ラムダ式をデリゲート (例: Func<int>) または式ツリー (例: )としてコンパイルする必要があるかどうかを判断できないためExpression<Func<int>>です。また、他の互換性のあるデリゲート型にすることもできます。したがって、デリゲートを作成する必要があります。

int foo = new Func<int>(() => { 
  Console.WriteLine("bar"); return 1; })(); 

デリゲートを返すだけのメソッドを定義してからメソッドを呼び出すことで、コードを少し簡略化できます。C# コンパイラはデリゲートの型を自動的に推測します。

static Func<R> Scope<R>(Func<R> f) { return f; }

// Compiler automatically compiles lambda function
// as delegate and infers the type arguments of 'Scope'
int foo = Scope(() => { Console.WriteLine("bar"); return 1; })(); 

これは使うべきではない醜いトリックだということには同意します :-) が、それを実行できるというのは興味深い事実です!

于 2010-02-26T00:18:42.270 に答える
7

ラムダ式で副作用が発生するのを止めるものは何もありません。

Func<int> expr = () =>
{
    Console.WriteLine("bar");
    return 1;
};
int foo = expr();
于 2010-02-25T23:44:17.827 に答える
5
int foo = (() => { printf("bar"); return 1; })();

編集:建設的な批評をありがとう、そうあるべきです

int i = ((Func<int>)(() => { printf("bar"); return 1; }))();
于 2010-02-25T23:45:02.460 に答える
3

ラムダの定義よりもさらに簡潔な構文を作成することを検討しまし()=>{M();}たが、読みやすく、ブロック、コレクション/オブジェクト初期化子、または配列初期化子と簡単に混同されない構文を実際に見つけることができませんでした。今のところ、ラムダ構文にこだわっています。

于 2010-02-26T00:21:36.800 に答える
2

あなたは匿名関数について話している:http://msdn.microsoft.com/en-us/library/bb882516.aspx、私は思う。

于 2010-02-25T23:44:21.743 に答える