16

このラムダ式がコンパイルされないのはなぜですか?

Action a = () => throw new InvalidOperationException();

推測でもかまいませんが、C# 言語仕様やその他のドキュメントを参照していただければ幸いです。

そして、はい、私は以下が有効であり、コンパイルされることを知っています:

Action a = () => { throw new InvalidOperationException(); };

このようなものを使用するコンテキストは、このブログ投稿で説明されています。

4

5 に答える 5

19

うーん。私は答えを得ましたが、それは素晴らしいことではありません。

「投げる」という表現があるとは思えない。throwステートメントがありますが、式だけではありません。void 型のメソッド呼び出し式である「Console.WriteLine()」と比較してください。

同様に、switch ステートメントや if ステートメントなどをラムダの本体として単独で使用することはできません。式またはブロックのみを持つことができます (セクション 7.14)。

それは何か助けになりますか?

于 2008-10-31T17:41:20.067 に答える
15

これが私の見解です:

throw表現ではなく、ステートメントです。

そして参照:

12.3.3.11 throw ステートメント

次の形式のステートメント stmt の場合

throw expr;

expr の先頭での v の明確な代入状態は、stmt の先頭での v の明確な代入状態と同じです。

本質を説明するには、C# ラムダ構造内で式が何を意味するかを考えるべきでしょう。これは、次の構文糖衣です。

delegate () { return XXX; }

式はどこXXXですか

于 2008-10-31T17:35:08.427 に答える
1

スコープのないラムダから戻ることもスローすることもできません。

このように考えてください... {} を指定しない場合、コンパイラは暗黙の戻り値が何であるかを判断します。throwラムダ内からの場合、戻り値はありません。あなたも戻っていませんvoid。コンパイラ チームがこの状況に対処しなかった理由はわかりません。

于 2008-10-31T17:35:52.090 に答える
1

ここから私が見つけることができるすべての参考文献:

http://msdn.microsoft.com/en-us/library/ms364047(VS.80).aspx#cs3spec_topic4

次の 2 つのオプションがあることを示します。

Action a = () => { throw new InvalidOperationException(); };

また

Action a = () => throw new InvalidOperationException()

; がないことに注意してください。終わりに。はい、それは私にとっても意味がありません。仕様で提供されている例は次のとおりです。

x => x + 1                     // Implicitly typed, expression body
x => { return x + 1; }         // Implicitly typed, statement body
(int x) => x + 1               // Explicitly typed, expression body
(int x) => { return x + 1; }   // Explicitly typed, statement body
(x, y) => x * y               // Multiple parameters
() => Console.WriteLine()      // No parameters

それがどれほどの助けになるかはわかりません-あなたがそれをどのようなコンテキストで使用しているのかわかりません。最後に、C#では意味がありません

違いは、{} がない場合、ステートメントではなく式の本体であるということです。つまり、スローは式ではなくステートメントであるため、そこでは有効ではありません。

于 2008-10-31T17:27:49.313 に答える
0

大きな驚きではありません。ラムダ式は関数型プログラミングの側面です。例外は手続き型プログラミングの側面です。2つのプログラミングスタイル間のC#メッシュは完全ではありません。

于 2008-10-31T17:52:28.110 に答える