如何在VS2017 RC中使用新的异步语义?

从Visual Studio 2017 RC发行说明引用

语言扩展和分析器

此版本包括一些我们正在为下一版本的C#和Visual Basic工作的新语言扩展。 默认情况下启用这些新语言function,包括:

对于C#:

  • 异步方法的类似任务的返回类型 :这引入了从异步方法返回任何类似任务类型的能力。 以前这些返回类型被约束为TaskTask

它说它默认启用,但我无法让它工作。 甚至从链接的Github页面下载精确的ArbitraryAsyncReturns.zip(并修复对React NuGet包的引用以删除不相关的错误),但是没有安装自定义VSIX包(用于VS2015),我继续得到

错误CS1983:异步方法的返回类型必须为void,Task或Task

我是否需要采取任何额外步骤才能使其正常工作?


我首先尝试将该特定示例缩减为应该起作用的最小版本,但尝试使用它,我还不知道应该起作用什么,不应该起作用。 至少,鉴于这种语言增强,我期待一个虚假的程序,如

 struct Test { } static class Program { static async Test Test() { } static void Main() { } } 

无法使用不同的错误消息进行编译。 获得相同的错误消息,甚至提示此语言扩展尚未启用,但JaredPar注意到错误消息尚未更新。


我现在将一个所谓的有效示例减少到我认为应该编译的最小版本(但由于未实现的方法而在运行时失败),但是不编译:

 using System; using System.Runtime.CompilerServices; using System.Threading.Tasks; namespace System.Runtime.CompilerServices { public class TasklikeAttribute : Attribute { public TasklikeAttribute(Type builderType) { } } } struct TasklikeTypeMethodBuilder { public static TasklikeTypeMethodBuilder Create() => throw new NotImplementedException(); public void Start(ref TStateMachine stateMachine) where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); public void SetStateMachine(IAsyncStateMachine stateMachine) => throw new NotImplementedException(); public void SetResult(T result) => throw new NotImplementedException(); public void SetException(Exception exception) => throw new NotImplementedException(); public TasklikeType Task => throw new NotImplementedException(); public void AwaitOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); public void AwaitUnsafeOnCompleted(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException(); } [Tasklike(typeof(TasklikeTypeMethodBuilder))] struct TasklikeType { } static class Program { static void Main(string[] args) { } static async TasklikeType TasklikeTypeTester() { await Task.Yield(); return "hello"; } } 

static async TasklikeType TasklikeTypeTester()生成与上面相同的编译器错误。

您无需其他任何操作即可启用类似任务的返回。 这里的问题是此function的diagonstic消息尚未更新。 以下是跟踪问题的链接:

https://github.com/dotnet/roslyn/issues/12621

TasklikeAttribute属性名称不是VS2017 RC中实现的,而是来自不同版本的提案。 实际实现的内容依赖于System.Runtime.CompilerServices.AsyncMethodBuilderAttribute类型,它看起来完全相同。

我无法找到这个文档,但我能够在Roslyn测试中找到它,例如CodeGenAsyncTests.cs :

 [AsyncMethodBuilder(typeof(ValueTaskMethodBuilder))] struct ValueTask { } ... namespace System.Runtime.CompilerServices { class AsyncMethodBuilderAttribute : System.Attribute { public AsyncMethodBuilderAttribute(System.Type t) { } } }