2

このように非同期Sub

Dim f As Func(Of Task) = Async Sub()
                         End Sub

コンパイラエラーが発生します:

エラーBC36670:ネストされたサブにデリゲート'System.Func(Of System.Threading.Tasks.Task)'と互換性のある署名がありません。

同等のC#コードは正常にコンパイルされます。

Func<Task> f = async () => { };

makeコードAsync Subへの書き換えは機能します。Async Function

Async Sub()タイプの戻り値を持つデリゲートタイプに変換できないのはなぜTaskですか?

4

1 に答える 1

4

VB.NETSubは、C#が.を返すのと同じvoidです。との間には違いがasync void Foo() {}ありasync Task Foo() {}、VB.NETは前者を実行しますが、後者は必要です。あなたが言うようにAsync Function、それは実際に後者を行うので、それを機能させます。

編集:いくつかの詳細:

C#:

async void Foo() { }

async Task Bar() { }

void Baz()
{
    object dummy;
    dummy = (Action) Foo; // OK
    dummy = (Func<Task>) Foo; // error
    dummy = (Action) Bar; // error
    dummy = (Func<Task>) Bar; // OK
}

ただし、デリゲートが使用される場合、デリゲートはと同等でFooありBar、同じように見えるため、これは少し混乱しますasync () => { }

Sub唯一の違いは、VB.NETでは、 orFunctionキーワードが構文の一部のままであるため、デリゲートが同じように見えないことです。

于 2012-04-20T12:10:27.700 に答える