为什么Task实现IAsyncResult,但不包含AsyncWaitHandle成员?

vto*_*ola 5 c# oop interface task iasyncresult

也许这是一个愚蠢的问题.

Task类被声明是这样的:

public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable
Run Code Online (Sandbox Code Playgroud)

IAsyncResult接口声明如下:

public interface IAsyncResult
{
    object AsyncState { get; }
    WaitHandle AsyncWaitHandle { get; }
    bool CompletedSynchronously { get; }
    bool IsCompleted { get; }
}
Run Code Online (Sandbox Code Playgroud)

但该成员AsyncWaitHandleTask类或实例中不存在.

这段代码:

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 
Run Code Online (Sandbox Code Playgroud)

引发此编译错误:

错误1'System.Threading.Tasks.Task'不包含'AsyncWaitHandle'的定义,并且没有扩展方法'AsyncWaitHandle'接受类型'System.Threading.Tasks.Task'的第一个参数可以找到(你错过了吗?使用指令或程序集引用?)

但是,这不仅编译:

System.IAsyncResult t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 
Run Code Online (Sandbox Code Playgroud)

但也有效,因为成员存在.这巫术是什么?

这是一个编译器技巧还是以另一种方式隐藏?

干杯.

Lee*_*Lee 6

TaskIAsyncResult显式实现,所以你必须先强制​​转换:

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
((IAsyncResult)t).AsyncWaitHandle.ToString()
Run Code Online (Sandbox Code Playgroud)

显式实现定义如下:

public class Task : IAsyncResult
{
    WaitHandle IAsyncResult.AsyncWaitHandle
    {
        get { ... }
    }
}
Run Code Online (Sandbox Code Playgroud)