【发布时间】:2017-04-29 05:55:09
【问题描述】:
引用Visual Studio 2017 RC Release Notes
语言扩展和分析器
此版本包括我们正在为 C# 和 Visual Basic 的下一版本开发的一些建议的新语言扩展。这些新语言功能默认启用,包括:
对于 C#:
- Task-like return types for async methods:这引入了从异步方法返回任何类似任务的类型的能力。以前,这些返回类型仅限于
Task<T>和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<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() 生成与上述相同的编译器错误。
【问题讨论】:
-
您对Task-like type的理解是什么?你读过引用的 GitHub 问题吗?
-
@PauloMorgado 当然。我不认为我的
Test结构是类似任务的类型。我特别指出我没想到代码会编译,我只是希望错误消息有所不同,指的是类似任务的类型而不是Task。我还尝试了 Github 问题中所谓的有效代码来自,它也无法编译。但是:类似任务的类型是应用了Tasklike属性的类型(可能是用户定义的),其中该属性指定了构建器类型。类型的作用实际上并不是编译器的问题,而且有些示例几乎不像任务。
标签: c# async-await visual-studio-2017 c#-7.0