C# 为什么VS2017说等待是一个未知的关键字?

C# 为什么VS2017说等待是一个未知的关键字?,c#,visual-studio-2017,task-parallel-library,C#,Visual Studio 2017,Task Parallel Library,在上面的示例中,IDE通知我“wait操作符只能在异步方法中使用”。它为我提供了修复,使我的方法签名异步无效或异步任务 internal /*async*/ void RunAsync() { var tasks = ...; await Task.WhenAll(tasks); } 在第二个示例中,它给出了错误“找不到等待的类型或命名空间”等待不是以颜色编码的语言关键字,IDE也没有自动修复 这是VS错误吗?在这两种情况下,代码都是无效

在上面的示例中,IDE通知我“wait操作符只能在异步方法中使用”。它为我提供了修复,使我的方法签名
异步无效
异步任务

    internal /*async*/ void RunAsync()
    {
        var tasks = ...;
        await Task.WhenAll(tasks);
    }
在第二个示例中,它给出了错误“找不到等待的类型或命名空间”<代码>等待不是以颜色编码的语言关键字,IDE也没有自动修复

这是VS错误吗?

在这两种情况下,代码都是无效的C代码。因此,编译器/IDE必须尽最大努力找出您试图执行的操作,并给出适当的错误消息

在上面的示例中,IDE通知我“wait操作符只能在异步方法中使用”。它为我提供了修复,使我的方法签名异步无效或异步任务

VS正在解析代码,并且非常确定此处的
await
await
操作符。代码不是有效的C#,但看起来您正试图这么做。因此,它为您提供了一个有用的建议,即必须使用
async
关键字才能将
wait
作为关键字

在第二个示例中,它给出了错误“找不到等待的类型或命名空间”。。。wait不是语言关键字的颜色编码,IDE也没有自动修复

VS正在解析代码,不确定此处的
await
await
运算符还是类型<代码>等待t看起来很像
intt到编译器

这是VS错误吗

这不是一个bug,因为代码从一开始就是无效的。但在第二种情况下,您可以要求提供更好的错误消息,而C#编译器团队可能会决定是否值得这样做,而不是开发其他功能


对于上下文,请注意。只有当
async
关键字存在时,它才是关键字
Wait
并不总是一个关键字,如果VS总是将其视为关键字,那将是一个bug。具体来说,在这里的两个代码示例中,
await
不是关键字。在第一个示例中,VS不遗余力地进行额外的回退分析,以检测开发人员打算使用
wait
关键字的常见场景。

作为旁白,您确实应该避免
async void
。使用
async Task
。当你说它无效时,你的确切意思是什么?你有编译错误吗?我拒绝你的前提,你绝对可以在这里等待
t
。@MichałTurczyn如果你取消
async
的注释显然没有问题。这感觉就像是一个编译器的怪事。不是很好,但是如果你想在GitHub上打开一个问题,他们可能会查看它。只有当出现
async
关键字时,它才是一个关键字。。。。如果VS总是将其视为关键字,这将是一个错误-在第一种方法中,
wait
以蓝色突出显示为关键字,即使在缺少
async
的情况下也是如此。那么根据你所说的,它应该是一个bug。@GSerg:编译器猜测用户的意图是使用
wait
作为关键字。由于代码无效,用户的意图始终是猜测,而编译器只是尽其所能。只要代码无效,就没有bug;如果编译器愿意,它可以对每一个错误都说“无效的C#file”。
    internal /*async*/ void RunAsync()
    {
        var tasks = ...;
        var t = Task.WhenAll(tasks);
        await t;
    }