如何在VS2017 RC中使用新的异步语义?
从Visual Studio 2017 RC发行说明引用
语言扩展和分析器
此版本包括一些我们正在为下一版本的C#和Visual Basic工作的新语言扩展。 默认情况下启用这些新语言function,包括:
对于C#:
- 异步方法的类似任务的返回类型 :这引入了从异步方法返回任何类似任务类型的能力。 以前这些返回类型被约束为
Task
和Task
。
它说它默认启用,但我无法让它工作。 甚至从链接的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消息尚未更新。 以下是跟踪问题的链接:
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) { } } }