2016-12-14 15 views
9

Trích dẫn từ Visual Studio 2017 RC Release NotesLàm cách nào để có được ngữ nghĩa async mới hoạt động trong VS2017 RC?

Extensions Ngôn ngữ và phân tích

Phiên bản này bao gồm một số phần mở rộng ngôn ngữ mới được đề xuất mà chúng tôi đang làm việc trên cho các phiên bản tiếp theo của C# và Visual Basic. Những tính năng ngôn ngữ mới được kích hoạt theo mặc định, bao gồm:

Đối với C#:

  • Task-like return types for async methods: này giới thiệu khả năng trả lại bất kỳ loại nhiệm vụ như thế nào từ một phương pháp async. Trước đây, các loại trả lại này đã bị hạn chế thành Task<T>Task.

Nó nói nó được bật theo mặc định, nhưng tôi không thể làm việc này được. Ngay cả khi tải xuống bản tải xuống ArbitraryAsyncReturns.zip chính xác từ trang Github được liên kết (và sửa các tham chiếu đến gói React NuGet để xóa các lỗi không liên quan), nhưng không cài đặt gói VSIX tùy chỉnh (dành cho VS2015), tôi tiếp tục nhận

lỗi CS1983: kiểu trả về của một phương pháp async phải được bãi bỏ, Task hoặc Task <T>

tôi có cần phải thực hiện bất kỳ bước bổ sung để làm việc này?


Lần đầu tiên tôi thử giảm ví dụ cụ thể đó xuống phiên bản tối thiểu cần thực hiện, nhưng cố gắng chơi với nó, tôi chưa biết nên làm gì và không nên làm gì. Ít nhất, mặc dù, với việc tăng cường ngôn ngữ này, tôi đã mong đợi một chương trình không có thật, chẳng hạn như

struct Test { } 
static class Program { 
    static async Test Test() { } 
    static void Main() { } 
} 

để không biên dịch với thông báo lỗi khác. Nhận được thông báo lỗi tương tự, ngay cả sau đó đề xuất rằng phần mở rộng ngôn ngữ này chưa được kích hoạt, nhưng JaredPar nhận thấy rằng thông báo lỗi đơn giản là chưa được cập nhật.


bây giờ tôi giảm một trong những ví dụ cho là hợp lệ để một phiên bản tối thiểu mà tôi nghĩ nên biên dịch (nhưng thất bại ở thời gian chạy do các phương pháp chưa thực hiện), nhưng không biên dịch:

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"; 
    } 
} 

Lỗi trình biên dịch tương tự như trên được tạo cho static async TasklikeType<string> TasklikeTypeTester().

+1

hiểu biết của bạn về những gì một ** Nhiệm vụ giống như là gì loại ** là? Bạn đã đọc vấn đề GitHub được tham chiếu chưa? –

+1

@PauloMorgado Tất nhiên. Tôi không nghĩ rằng cấu trúc 'Test' của tôi là một kiểu nhiệm vụ. Tôi đặc biệt chỉ ra rằng tôi đã không mong đợi rằng mã để biên dịch, tôi chỉ đơn thuần là dự kiến ​​thông báo lỗi là khác nhau, để tham khảo các loại giống như nhiệm vụ chứ không phải là 'Task'. Và tôi cũng đã thử mã được cho là hợp lệ * từ * vấn đề Github, cũng không biên dịch được. Nhưng: một kiểu giống nhiệm vụ là một kiểu có thuộc tính 'Tasklike' được áp dụng cho nó (có thể do người dùng định nghĩa), trong đó thuộc tính đó chỉ định một kiểu trình tạo. Những gì các loại không thực sự là vấn đề của trình biên dịch, và một số ví dụ hầu như không giống như nhiệm vụ. – hvd

Trả lời

5

Các TasklikeAttribute tên thuộc tính hóa ra không được những gì đang thực hiện trong VS2017 RC, đó là từ một phiên bản khác của đề xuất. Những gì thực sự thực hiện dựa trên một loại System.Runtime.CompilerServices.AsyncMethodBuilderAttribute, có vẻ như hoạt động chính xác theo cùng một cách.

tôi đã không thể tìm thấy tài liệu này, nhưng tôi đã có thể tìm thấy điều này trong các bài kiểm tra Roslyn, ví dụ CodeGenAsyncTests.cs:

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

'[AsyncMethodBuilder]' nhỏ hơn rất nhiều so với '[Tasklike]' :( –

6

Bạn không cần phải làm gì khác để bật trả về công việc. Vấn đề ở đây là thông điệp diagonstic cho tính năng này chưa được cập nhật. Dưới đây là một liên kết đến các vấn đề theo dõi:

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

+0

Ồ! Cảm ơn vì điều đó, câu trả lời là một phần của nó. Mã được cho là hợp lệ mà tôi liên kết trong câu hỏi của tôi cũng không thành công. Khi có thể, tôi sẽ cố gắng cập nhật câu hỏi của mình với một chương trình tối thiểu mà tôi nghĩ * nên hợp lệ. – hvd

+0

Vâng, nó quay ra bạn đã đúng rằng không có gì để làm để cho phép trả về nhiệm vụ giống như. Tuy nhiên, đề nghị mà MS liên kết đến không phải là chính xác những gì đã được thực hiện ... Đó là vô nghĩa khó hiểu. – hvd

+0

Như @hvd nói, điều đó trả lời một phần của nó, Nhưng mặc dù không có gì để làm để cho phép trả về nhiệm vụ, tôi thậm chí không thể tìm thấy "ValueTask" ra khỏi hộp trong VS 2017 RC, và tôi không biết nếu tôi phải tải xuống và cài đặt gói ArbirtraryAsynReturns.zip và VSIX để tải xuống. – SERWare

Các vấn đề liên quan