2011-09-25 2 views
3

나는 간단한 일반적인 위임이 있습니다키워드는 제네릭 형식으로 현재의 객체를 참조하는

public abstract class CommandBase 
{ 
    public CommandBase() 
    { } 

    public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback) 
     where TCommand : CommandBase 
    { 
     // Async stuff happens here 

     callback.Invoke(this as TCommand); 
    } 
} 

이 작업을 수행하는 동안, 나는이 :

delegate void CommandFinishedCallback<TCommand>(TCommand command) 
    where TCommand : CommandBase; 

나는 다음과 같은 추상 클래스에서 사용을 TCommand를 Execute에 전달하여 현재 객체의 유형 (더 파생 된 CommandBase)으로 강제 할 방법이 없습니다.

public abstract class CommandBase<TCommand> 
    where TCommand : CommandBase<TCommand> 
{ 
    // class goes here 
} 

을하지만 그 달성을위한 C#을 키워드가없는 이유가 궁금하네요 :

나는이 일을 해결 봤어요? 내가보고 싶어하는 것은 다음과 같습니다 :

public void ExecuteAsync<TCommand>(CommandFinishedCallback<TCommand> callback) 
    where TCommand : This 
{ 
    // Async stuff happens here 

    callback.Invoke(this); 
} 

"This"에 대문자 T가 있음을 유의하십시오. 나는 결코 언어 디자이너가 아니지만 나는 점심을 먹으려 고하지 않을지 궁금합니다. 이것이 CLR이 처리 할 수있는 것이겠습니까?

이미 문제를 해결하기위한 패턴이 있습니까?

+0

GitHub의 Roslyn 팀에게이 거의 정확한 기능에 대한 제안 요청을 추가했습니다. 그것을 여기에서 조사해라 : https://github.com/dotnet/roslyn/issues/4332 –

답변

2

아니요, 아니요, thistype 제약이 없습니다. 에릭 리 퍼트 (Eric Lippert)의이 주제에 대한 약간의 의구심이 있습니다 : Curiouser and curiouser.

특히, CRTP (문제의 "해결책")은 실제로 해결책이 아닙니다.

+0

위대한 기사! 감사. – mbursill

0

아니요, C#에는 그런 것이 없습니다. 이 작업을 원할 경우 자체 참조하는 제네릭 클래스 정의로 가야합니다.

관련 문제