语言扩展和分析器
此版本包括一些我们正在为下一版本的C#和Visual Basic工作的新语言扩展.默认情况下启用这些新语言功能,包括:
对于C#:
- 异步方法的类似任务的返回类型:这引入了从异步方法返回任何类任务类型的能力.以前这些返回类型被限制为
Task<T>和Task.
它说它默认启用,但我无法让它工作.甚至从链接的Github页面下载精确的ArbitraryAsyncReturns.zip(并修复对React NuGet包的引用以删除不相关的错误),但是没有安装自定义VSIX包(用于VS2015),我继续得到
错误CS1983:异步方法的返回类型必须为void,Task或Task <T>
我是否需要采取任何其他步骤才能使其正常工作?
我首先尝试将该特定示例缩减为应该起作用的最小版本,但尝试使用它,我还不知道应该使用什么,什么不应该.至少,鉴于这种语言增强,我期待一个虚假的程序,如
struct Test { }
static class Program {
static async Test Test() { }
static void Main() { }
}
Run Code Online (Sandbox Code Playgroud)
无法使用不同的错误消息进行编译.获得相同的错误消息,甚至提示此语言扩展尚未启用,但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 …Run Code Online (Sandbox Code Playgroud) 似乎GetAwaiter可以等待任何实现需求的对象,Task<>类型只是满足此要求的众多可能类型之一.但是,似乎一种async方法只能返回Task<>或void据我所知.是否有可能挂钩我的自定义任务等待类型,所以我可以指定我的自定义等待类型作为异步返回类型,然后当然我可以随后await链接通常的调用链.像:(伪代码)
async MyAwaitable MyAwaitableMethod()
{
await myAwaitable;
}
async Task MyTask()
{
await MyAwaitableMethod();
}
Run Code Online (Sandbox Code Playgroud)
背景信息:整个想法实际上源于C++ 1z/2x协程提案,它基本上具有相同的基本模型,但它允许更多控制来定义promise_type从协程返回嵌入的任何类型(因此的co_await).
[编辑]
除了答案中提供的链接之外,我还在以下链接中找到了更多信息,似乎确实有一些关于这个主题的热门讨论:
[EDIT2]
令人惊讶的是,在进一步挖掘之后,这实际上是C#7.0的一个预期功能:http://intellitect.com/generalized-async-return-types/