아마도 어리석은 질문 일 수 있습니다.어떻게 Task가 IAsyncResult를 구현하지만 AsyncWaitHandle 멤버를 포함하지 않습니까?
은 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();
이 컴파일 오류를 발생시킵니다 :
Error 1 'System.Threading.Tasks.Task' does not contain a definition for 'AsyncWaitHandle' and no extension method 'AsyncWaitHandle' accepting a first argument of type 'System.Threading.Tasks.Task' could be found (are you missing a using directive or an assembly reference?)
그러나,이 컴파일뿐만 아니라 :
System.IAsyncResult t = new System.Threading.Tasks.Task(() => { });
t.AsyncWaitHandle.ToString();
그러나 구성원이 존재하기 때문에 또한, 작동합니다. 이 마법은 무엇인가?
이것은 컴파일러의 트릭입니까 아니면 다른 방식으로 숨겨져 있습니까?
건배. 먼저 캐스팅이 명시 적으로, 그래서
+1 마술. – Gusdor