從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