質問: C#5.0の非同期で待ち受けて待つ Task or Task object is awaitable, so we can use await key on those whose return value is Task or Task. Task or Task are the most frequently-used awaitable object. 私たちはまた、私たち自身の待っているオブジェクトを定義することができます。オブジェクトは以下の資格を持つ必要があります。 1. It has a GetAwaiter() method (instance method or extension method); 2. Its GetAwaiter() method returns an awaiter. An object is an awaiter if: * It implements INotifyCompletion or ICriticalNotifyCompletion interface; * It has an IsCompleted, which has a getter and returns a Boolean; * it has a GetResult() method, which returns void, or a result. 私の質問は、Microsoftがこれらの待ち受けオブジェクトを制約するためのインターフェイスを提供しなかった理由です。 待望のオブジェクトを実装する現在の方法は少し複雑です。
回答: これは、 `foreach` キーワード( C#言語仕様" foreach文 ")。 基本的には、ダックタイピングです。型が `MoveNext` メソッドと `Current` プロパティを実装している場合は、C#コンパイラがオブジェクトによって公開されたシーケンスを反復処理する方法を知るために必要なすべてです。 これは、コレクション初期化子(C#言語仕様 "コレクション初期化子"のセクション7.6.10を参照)にも適用されます。唯一の要件は、型が、 `System.Collections .IEnumerable` インターフェイスにあり、 `Add` メソッドがあります。 つまり、 `待って`キーワード特定のインタフェース実装を必要とせず(インタフェースを使用する場合はインタフェースがこれらのメソッドを提供しますが)、コンパイラが認識できるメソッドのパターンに過ぎません。