从Visual Studio 2017 RC Release Notes如何获得在VS2017 RC中工作的新异步语义?
语言扩展和分析仪
此版本包括我们正在为C#和Visual Basic的下一个版本的一些提议的新的语言扩展引用。这些新的语言功能是默认启用的,其中包括:
对于C#:
- Task-like return types for async methods:此介绍从异步方法返回任何任务样类型的能力。以前,这些退货类型限制为
Task<T>
和Task
。
它说这是默认启用,但我无法得到它的工作。即使从链接的Github页面下载确切的ArbitraryAsyncReturns.zip(并修复了React NuGet包的引用以删除无关的错误),但是没有安装VSIX包(这是VS2015),我仍然继续获得
错误CS1983:异步方法的返回类型必须为void,任务或任务<牛逼>
我是否需要采取任何额外的步骤来得到这个工作?
我第一次尝试减少具体的例子,以最小的版本,应该工作,但试图与它玩,我还不知道应该怎样工作,什么不应该。至少,鉴于这种语言的增强,我预计假冒程序,如
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<T> {
public static TasklikeTypeMethodBuilder<T> Create() => throw new NotImplementedException();
public void Start<TStateMachine>(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<T> Task => throw new NotImplementedException();
public void AwaitOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : INotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException();
public void AwaitUnsafeOnCompleted<TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine stateMachine) where TAwaiter : ICriticalNotifyCompletion where TStateMachine : IAsyncStateMachine => throw new NotImplementedException();
}
[Tasklike(typeof(TasklikeTypeMethodBuilder<>))]
struct TasklikeType<T> { }
static class Program {
static void Main(string[] args) { }
static async TasklikeType<string> TasklikeTypeTester() {
await Task.Yield();
return "hello";
}
}
对于static async TasklikeType<string> TasklikeTypeTester()
,会生成与上面相同的编译器错误。
什么是你的**任务,像什么的理解类型**是?你读过引用的GitHub问题吗? –
@PauloMorgado当然。我不认为我的'Test'结构是类似于任务的类型。我特别指出,我不希望代码编译,我只是希望错误消息是不同的,指的是任务类型而不是“任务”。而且我也尝试了Github问题中的所谓有效代码*,该代码无法编译。但是:任务类型类型是应用了Tasklike属性的类型(可以是用户定义的),其中该属性指定了构建器类型。这些类型所做的并不是真正的编译器问题,有些例子几乎不像任务。 – hvd