5

拡張メソッドを実装して配列を awaitable にしたかった

public static IAwaitable GetAwaiter(this mytype[] t)
{
    return t.First().GetAwaiter();
}

しかし、IntelliSense が "(awaitable) mytype[]" と言っていても、コンパイラは使用時にエラーを出します

mytype[] t = new mytype[] { new mytype(), new mytype() };
await t;

mytype の単一のオブジェクトで await を呼び出すと、正常に機能します。何故ですか?私は何か間違ったことをしていますか?ご協力いただきありがとうございます。

4

1 に答える 1

3

これはコンパイラのバグだと思いますので、報告してください。

このコードが機能しないことを確認できます (カスタム型ではなくTaskandを使用):TaskAwaiter

public static TaskAwaiter GetAwaiter(this Task[] tasks)
{
    return tasks.First().GetAwaiter();
}

Task[] tasks = …;
await tasks;

(報告されているように、「'System.Threading.Tasks.Task[]' を待機できません」というエラーが生成されます。)

IEnumerableただし、 (メソッドとローカルの両方で) の配列の交換は機能します。

public static TaskAwaiter GetAwaiter(this IEnumerable<Task> tasks)
{
    return tasks.First().GetAwaiter();
}

IEnumerable<Task> tasks = …;
await tasks;

興味深いことに、固定バージョンでは、配列を直接待機しても機能しません。しかし、たとえば待っているIListことはうまくいきます。

于 2013-01-07T15:44:52.203 に答える