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>
và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()
.
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? –
@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