也许这是一个愚蠢的问题。
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'而没有扩展方法'AsyncWaitHandle' 接受'System.Threading.Tasks.Task'类型的第一个参数可以 找到(你错过了使用指令或汇编引用吗?)
然而,这不仅编译:
System.IAsyncResult t = new System.Threading.Tasks.Task(() => { });
t.AsyncWaitHandle.ToString();
但也有效,因为会员存在。这巫术是什么?
这是一个编译技巧还是以另一种方式隐藏?
干杯。
答案 0 :(得分: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 { ... }
}
}
答案 1 :(得分:2)
msdn docs很好地总结了它。
http://msdn.microsoft.com/en-us/library/ms173157.aspx
类成员IControl.Paint只能通过IControl获得 接口和ISurface.Paint只能通过ISurface获得。都 方法实现是分开的,也不是直接可用的 在课堂上。
interface IControl
{
void Paint();
}
interface ISurface
{
void Paint();
}
class SampleClass : IControl, ISurface
{
void IControl.Paint()
{
System.Console.WriteLine("IControl.Paint");
}
void ISurface.Paint()
{
System.Console.WriteLine("ISurface.Paint");
}
}
这里要说明的是显式接口实现是私有的,并且与编译器魔法绑定。