3

興味深い質問があります。MSDN yield構文によると:

yield return <expression>; // yield some value
yield break;               // exiting from iterator

それだけではない理由:

yield <expression>;        // yield some value
return;                    // exiting from iterator

私にとっては、2 番目の形式の方が冗長ではありませんが、最初の形式と同じ意味を持ちます。問題は、.NET 設計者がなぜ最初の形式を選択したのかということです。これはどのような理由で発生する可能性がありますか? 2 番目のフォームにはどのような潜在的な設計上の問題がありますか?

4

3 に答える 3

5

yield 自体が使用されなかった主な理由は、新しいキーワードが導入され、古いコードを扱うときに下位互換性が失われる可能性があるためです。

returnこのため、C# 言語チームは、yield をコンテキスト キーワードにすることにしました (これは、 orが続く場合にのみキーワードになりbreakます)。

次のコードを検討してください。

yield variable;

yield は aclassまたは aの名前でありstruct、このステートメントは変数宣言である可能性があります。

また、記述と保守が容易になるように設計された C# のような複雑な言語では、ステートメントに 1 つの意味しか持たないようにする必要があります。returnイテレータにいるかどうかに応じて異なることを行うと、言語に深刻な制限が生じる可能性があります。

http://blogs.msdn.com/b/ericgu/archive/2006/03/08/546296.aspx

于 2012-06-30T22:02:00.253 に答える
4

ここに 1 つの可能性があります: 技術的なあいまいさが生じる可能性があります (これは予約済みのキーワードではなく、文脈上yieldのキーワードであることを思い出してください)... 可能性は低いですが:

struct yield {}

それで

yield x;

実際には変数宣言です。「yield return x;」では、それは一方向のみ有効です。

これが本当かどうかはわかりません。ちょっとした考え。

于 2012-06-30T22:00:23.433 に答える
2

このreturnステートメントには、メソッドの戻り値の型の式を返す必要があるという 1 つの意味があります。イテレータにはvoid戻り値の型がないため、returnステートメントを使用してイテレータを終了しても、何も「返さない」ため、この意味には従いません。

yield breakイテレータがそれ以上要素を返さずに終了する必要があることを示します。IMHOこれにより、この目的でステートメントをyield break使用するよりもステートメントが明確になります。return

于 2012-06-30T21:56:21.777 に答える