5

たぶんそれはばかげた質問です。

Taskクラスは次のように宣言されます。

public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable

IAsyncResultインターフェイスは次のように宣言されます。

public interface IAsyncResult
{
    object AsyncState { get; }
    WaitHandle AsyncWaitHandle { get; }
    bool CompletedSynchronously { get; }
    bool IsCompleted { get; }
}

しかし、メンバーはクラスまたはインスタンス AsyncWaitHandleに存在しません。Task

このコード:

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 

次のコンパイル エラーが発生します。

エラー 1 'System.Threading.Tasks.Task' には 'AsyncWaitHandle' の定義が含まれておらず、タイプ 'System.Threading.Tasks.Task' の最初の引数を受け入れる拡張メソッド 'AsyncWaitHandle' が見つかりませんでした (ディレクティブまたはアセンブリ参照を使用していますか?)

ただし、これはコンパイルされるだけではありません。

System.IAsyncResult t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 

しかし、メンバーが存在するため、機能します。この魔法は何ですか?

それはコンパイラのトリックですか、それとも別の方法で隠されていますか?

乾杯。

4

2 に答える 2

6

Task明示的に実装するIAsyncResultため、最初にキャストする必要があります。

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
((IAsyncResult)t).AsyncWaitHandle.ToString()

明示的な実装は次のように定義されます。

public class Task : IAsyncResult
{
    WaitHandle IAsyncResult.AsyncWaitHandle
    {
        get { ... }
    }
}
于 2014-03-04T14:11:38.057 に答える