私はC#5.0非同期プログラミングの作業を本当に楽しんでいます。しかし、TAPモデルと一貫性を持たせるために古いコードを更新することが私にとって問題を引き起こしている場所はいくつかあります。タスク<TResult>はTResultで共変なC#5.0待ち時間にラップすることができますか?
:私はTask<TResult>
はTResultに共変されていない正確な理由はわからないが、非同期パターンに同期から移動するために、共変のインターフェイスを更新しようとしたとき、それは私のために問題を引き起こしている -
ここではそのうちの一つです旧コード:
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();
}
新しいコード(コンパイルされません):
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 **
}
は、合理的な方法は、MOせずにこの問題を回避ありです私のAPIをあまりにも劇的に変えてしまいましたか? (ボーナス:なぜタスクは共変しないのですか?) IAwaitableインターフェイスはありませんが、私はそれを作って、ラップされた共変のawiatableタスクオブジェクトに変換する拡張メソッドを作成することができます。それとも間違っているのですか?
ところで、 'Task'は共変のインターフェイスであっても、あなたのコードがコンパイルされないでしょう。正しいバージョンは 'Task InitializeAsync();'(その行に 'out'修飾子なし)です。 –
svick
優れた点。私はVSでそれを修正したが、SOを編集するのを忘れてしまった。 –