2016-12-14 49 views
9

Visual Studio 2017 RC Release Notes如何获得在VS2017 RC中工作的新异步语义?

语言扩展和分析仪

此版本包括我们正在为C#和Visual Basic的下一个版本的一些提议的新的语言扩展引用。这些新的语言功能是默认启用的,其中包括:

对于C#:

它说这是默认启用,但我无法得到它的工作。即使从链接的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(),会生成与上面相同的编译器错误。

+1

什么是你的**任务,像什么的理解类型**是?你读过引用的GitHub问题吗? –

+1

@PauloMorgado当然。我不认为我的'Test'结构是类似于任务的类型。我特别指出,我不希望代码编译,我只是希望错误消息是不同的,指的是任务类型而不是“任务”。而且我也尝试了Github问题中的所谓有效代码*,该代码无法编译。但是:任务类型类型是应用了Tasklike属性的类型(可以是用户定义的),其中该属性指定了构建器类型。这些类型所做的并不是真正的编译器问题,有些例子几乎不像任务。 – hvd

回答

5

TasklikeAttribute属性名称原来是不是在VS2017 RC实施,从不同版本的提议,即是。实际上实施的依赖于类型System.Runtime.CompilerServices.AsyncMethodBuilderAttribute,它看起来工作方式完全相同。

我没能找到这个文件,但我能找到这个在罗斯林测试,例如CodeGenAsyncTests.cs

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

'[AsyncMethodBuilder]'不如'[Tasklike]':( –

6

没有什么需要做的事情来启用任务式返回。这里的问题是此功能的diagonstic消息尚未更新。这里是一个链接到跟踪问题:

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

+0

哦!感谢你的回应,这就是它的一部分。尽管如此,我在我的问题中链接到的假设有效的代码也失败了。当我可以的时候,我会尝试用我认为应该是有效的最小程序来更新我的问题。 – hvd

+0

好吧,事实证明你是对的,没有任何事情可以实现类似任务的回报。然而,MS链接的提议并不完全是实现的......这是毫无意义的混淆。 – hvd

+0

正如@ hvd所说,它回答了其中的一部分,但尽管没有任何事情可以启用类似任务的回报,但我甚至无法在VS 2017 RC中找到“ValueTask”,但我不知道如果我必须下载并安装ArbirtraryAsynReturns.zip和VSIX包来获取它。 – SERWare