2013-12-13 4 views
2

나는 항목 방법컴파일러에서 내 메서드를 찾을 수없는 이유는 무엇입니까?

internal void Run() 
{ 
//do stuff... 
} 

내가 테스트를 위해 서브 클래스 ("TestWorker : 근무을")가 함께 클래스 "노동자"가

internal void Run(object aParam) 
{ 
//do something with aParam, then.. 
Run(); 
} 

내가 테스트 응용 프로그램이 항목의 방법으로하는 새로운 스레드에서 TestWorker의 인스턴스를 시작

 Worker worker; 
     Thread workerThread; 
... 
     worker = new TestWorker(); 
     workerThread = new Thread(new ParameterizedThreadStart(worker.Run)); 
     workerThread.Start("something"); 

이 컴파일되지 않으며, 컴파일러는 매개 변수 대리인이 (내 서브 클래스)를 찾을 수 없음을보고합니다. 내 TestWorker.Run (개체)가 재정의하도록 내 가상 클래스 Run (개체) 메서드를 선언하여이 문제를 극복 할 수 있지만 IMHO는 비 숙련 된 솔루션이므로이 작업을 수행해야하는 이유는 무엇입니까? 그것은 컴파일러의 특질인가, 아니면 내가 논리적으로 잘못된 것을하고 있는가?

답변

5

문제는 worker의 컴파일시의 형태는 단지 Worker 것을 - 그리고 는 매개 변수를 받아들이는 Worker.Run 방법이 없습니다.

이 자체 대의원 함께 할 수 없다 - 당신도

worker.Run("foo"); 

를 호출 할 수 없습니다. 이 문제를 해결하는 가장 간단한 방법은 worker의 선언을 TestWorker으로 변경하는 것입니다. 또는 별도의 지역 변수를 사용하십시오.

TestWorker testWorker = new TestWorker(); 
workerThread = new Thread(new ParameterizedThreadStart(testWorker.Run)); 
worker = testWorker; 
+0

나는 선언을 변경하려고했지만 반복적으로 솔루션을 구축 할 때 동일한 오류가 발생합니다. 따라서 제 질문을 생각해보십시오. 그러나 프로젝트를 명시 적으로 정리하고 다시 빌드하면 오류가 사라진다는 것을 알게되었습니다. 어쩌면 그것은 VS2008 특질 일 것입니다. –

+0

@NeilHaughton : 질문에 왜 * 언급하지 않았습니까? 괜찮을 것입니다 - 문제를 보여주는 짧지 만 완전한 * 프로그램을 보여주십시오. 내가 동시에 작동하는지 보여줄 것입니다. –

+0

@NeilHaughton : 당신이 지금 대답을 받아 들였을 때, 아마 결국 그것이 작동한다는 것을 알았고 당신은 다른 문제를 겪었을 것입니다. –

관련 문제