[解決済み] C#では、なぜ無名メソッドはyieldステートメントを含むことができないのですか?
質問
このようなことができたらいいなと思いました(ラムダがyield returnをする)。
public IList<T> Find<T>(Expression<Func<T, bool>> expression) where T : class, new()
{
IList<T> list = GetList<T>();
var fun = expression.Compile();
var items = () => {
foreach (var item in list)
if (fun.Invoke(item))
yield return item; // This is not allowed by C#
}
return items.ToList();
}
しかし、匿名メソッドでyieldが使えないことがわかりました。 なぜかというと その yield ドキュメント には、それが許されないと書いてあるだけです。
許されないので、私はただListを作成し、そこにアイテムを追加しました。
どのように解決するのですか?
Eric Lippert は最近、なぜ yield が許されない場合があるのかについて、一連のブログ記事を書きました。
EDIT2です。
- パート 7 (これは後に投稿されたもので、特にこの質問を扱っています)
おそらくそこで答えが見つかるでしょう...
EDIT1: これは第5部のコメントで、Abhijeet Patelのコメントに対するEricの答えで説明されています。
Q :
エリック
また、以下の点についても教えてください。 なぜ、quot;yields" が 匿名メソッドまたはラムダ式
A :
<ブロッククオートいい質問ですね。私は 匿名イテレータブロックが欲しいです。そうすれば を作ることができるのは本当に素晴らしいことです。 小さなシーケンスジェネレータを ローカル変数をクローズする小さなシーケンスジェネレータをインプレースで 変数を閉じるような小さなシーケンスジェネレータをインプレースで作ることができたら、本当に素晴らしいことです。なぜそうしないかというと、理由は簡単です。 その理由は簡単で、メリットがコストを上回らないからです。 コストに見合わないからです。シーケンスジェネレータをインプレースにすることのすばらしさは インプレースでシーケンスジェネレータを作ることのすばらしさは をインプレースで作ることのすばらしさは、全体から見れば非常に小さいものです。 をインプレースで作ることの素晴らしさは、全体から見れば非常に小さなものであり、ノミナルメソッド で十分なのです。 で十分です。ですから、そのメリットは ということです。
コストが大きい イテレータ の書き換えは、コンパイラの中で最も複雑な であり 匿名メソッドの書き換えは 2番目に複雑である。匿名 メソッドの中に他の匿名 匿名メソッドは他の匿名メソッドの中に入ることができ、匿名メソッドはイテレータブロックの中に入ることができます。 イテレータブロックの中に入ることができる。そこで というわけで、まず、すべての 無名メソッドを メソッドに書き換えます。これは これはコンパイラがメソッドのILを生成する前に メソッドのILを生成する前にコンパイラが行う最後の2番目の作業です。 このステップが完了すると、イテレータ リライターは イテレータのリライタは、イテレータブロックに無名メソッドがないと見なすことができます。 ブロックには無名メソッドはないと考えることができます。 すでにすべて書き直されています。そのため、イテレータ のリライターは、イテレータを書き換えることだけに集中できます。 イテレータの書き換えに集中できます。 イテレータの書き換えに集中できます。 その中に未実現の匿名メソッドがあるかもしれないことを気にすることなく、イテレータの書き換えに集中できます。
また、イテレータブロックは決して "nest"することはありません。 無名メソッドとは異なります。イテレータ リライターは、すべてのイテレータ ブロックはトップレベルであると考えることができます。
匿名メソッドがイテレータブロックを含むことを許可されている場合 イテレータブロックを含むことができるのであれば これらの仮定は窓の外に出てしまいます。 イテレータブロックに は匿名メソッドを含んでいて を含む無名メソッド イテレータブロックを含み、そのイテレータブロックが を含むイテレータブロックがある... うっそー ここで、ネストしたイテレータを扱えるように をネストしたイテレータブロックやネストした匿名メソッドを扱えるような書き換えパスを書かなければなりません。 ブロックとネストした無名メソッドを同時に扱えるような を同時に扱えるような書き換えパスを書く必要があります。 複雑なアルゴリズムをひとつに統合して より複雑なアルゴリズムに統合することになります。これは 設計も、実装も、テストも、本当に大変です。 設計、実装、テストが大変です。私たちは十分賢いので そう確信しています。私たちは賢いチームです しかし しかし、私たちは でも、「あったらいいな」程度の機能のために、大きな負担を負いたくない。 でも、必要な機能ではありません。-- エリック
関連
-
[解決済み】C#におけるtypedefの等価性
-
[解決済み] [Entity Framework 4.1でエンティティに関連オブジェクトを追加する際に、エンティティオブジェクトをIEntityChangeTracker.の複数のインスタンスから参照できない。
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】C# ASP.NET使用時に「WebClientのリクエスト中に例外が発生しました。
-
[解決済み] EqualsメソッドがオーバーライドされたときにGetHashCodeをオーバーライドすることが重要な理由は何ですか?
-
[解決済み] ロックステートメントのボディ内で 'await' 演算子を使用できないのはなぜですか?
-
[解決済み】なぜC#のインターフェースはフィールドを含むことができないのですか?
-
[解決済み】C#の無名メソッドの購読を解除する
-
[解決済み] 普通の IEnumerable を使用することができるのに、なぜ yield キーワードを使用するのですか?
-
[解決済み] Invokeコールの匿名メソッド
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】統合マネージドパイプラインモードで適用されないASP.NETの設定が検出された
-
[解決済み】SmtpException: トランスポート接続からデータを読み取れません:net_io_connectionclosed
-
[解決済み】Unity 「関連するスクリプトを読み込むことができません」「Win32Exception: システムは指定されたファイルを見つけることができません"
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み] [Solved] .NETでスレッドの終了を待つには?
-
[解決済み】画像のペイントにTextureBrushを使用する方法
-
[解決済み】「namespace」なのに「type」のように使われる。
-
[解決済み】Nullableオブジェクトは値を持たなければならない?
-
[解決済み] 1つの値から新しいIEnumerable<T>シーケンスを作成するためのお気に入りの方法?