为什么我不能在一个陈述中用括号括起Await?

时间:2015-11-25 00:03:45

标签: vb.net async-await

在C#中,我有一些看起来像的代码:

(await GetBoolAsync()).ShouldBeTrue();

ShouldBeTrue()是来自在布尔值上运行的Shouldly库的扩展方法。

VB.NET似乎不喜欢在括号中包装Await关键字:

(Await GetBoolAsync()).ShouldBeTrue()

编译器在行的开头报告开括号的语法错误。我可以通过声明一个中间变量来解决它,但有没有办法在像C#这样的一行中实现这一点?

一个完整的控制台应用程序来重现这个:

Imports System.Runtime.CompilerServices

Module Module1

    Sub Main
    End Sub

    Async Function Test() As Task
        (Await GetBoolAsync()).ShouldBeTrue()
    End Function

    Function GetBoolAsync() As Task(Of Boolean)
        Return Task.FromResult(True)
    End Function

    <Extension()>
    Public Sub ShouldBeTrue(x As Boolean)
    End Sub

End Module

错误非常无益:

  

错误BC30035:语法错误。

1 个答案:

答案 0 :(得分:2)

这样做有一种特殊的语法 - 您应该使用flatMap关键字:

Call

那是因为你不能像在C#中那样直接调用Visual Basic中非文字表达式的成员:

Async Function Test() As Task
    Call (Await GetBoolAsync()).ShouldBeTrue()
End Function

在这种特殊情况下,这包括(5).ToString() 'It is wrong! 的结果。

希望有所帮助!