2016-12-14 22 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