Tôi thực sự thích làm việc với lập trình C# 5.0 không đồng bộ. Tuy nhiên, có một vài nơi mà việc cập nhật mã cũ để phù hợp với mô hình TAP đang gây ra vấn đề cho tôi.Có thể/nên Task <TResult> được bọc trong C# 5.0 awaitable đó là covariant trong TResult?
Dưới đây là một trong số họ - Tôi không chắc chắn chính xác lý do tại sao Task<TResult>
không hiệp biến trong TResult, nhưng nó gây khó khăn cho tôi khi cố gắng cập nhật một giao diện hiệp biến để di chuyển từ một đồng bộ để một mô hình không đồng bộ:
cũ mã:
public interface IInitializable<out T> // ** out generic modifier **
{
/// <summary>
/// Boolean to indicate if class is ready
/// </summary>
bool IsInitialized { get; }
/// <summary>
/// Calls for instance to be initialized using current parameters
/// Driver initialization can be done in the default constructor if desired
/// </summary>
T Initialize();
}
Code mới (sẽ không biên dịch):
public interface IAsyncInitializable<out T> // ** out generic modifier...broken **
{
/// <summary>
/// Boolean to indicate if class is ready
/// </summary>
bool IsInitialized { get; }
/// <summary>
/// Calls for instance to be initialized using current parameters
/// Driver initialization can be done in the default constructor if desired
/// </summary>
Task<T> InitializeAsync(); // ** breaks because Task<TResult> is invariant in TResult **
}
có là một cách hợp lý xung quanh này mà không cần mo difying API của tôi quá mạnh? (Tiền thưởng: tại sao Task không covariant?). Không có giao diện IAwaitable, nhưng tôi cho rằng tôi có thể tạo một giao diện và tạo một phương thức mở rộng chuyển đổi thành một đối tượng nhiệm vụ được bao bọc, covariant, awiatable. Hay tôi làm sai?
BTW, thậm chí nếu 'Task' là một giao diện hiệp biến, mã của bạn sẽ không biên dịch. Phiên bản chính xác sẽ là 'Task InitializeAsync();' (không có biến tố 'out' trên dòng đó). –
svick
Một điểm tuyệt vời. Tôi đã sửa lỗi đó trong VS, nhưng quên chỉnh sửa SO. –