Ключевое слово для ссылки на текущий объект как универсальный тип - PullRequest
3 голосов
/ 25 сентября 2011

У меня есть простой универсальный делегат:

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

Я использую его в следующем абстрактном классе:

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);
    }
}

Хотя это работает, у меня нет способа заставить 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);
}

Обратите внимание на заглавную букву T на "This".Я ни в коем случае не дизайнер языков, но мне любопытно, обедаю я или нет.Может ли это быть тем, с чем справится CLR?

Может быть, уже есть шаблон для решения проблемы?

Ответы [ 2 ]

2 голосов
/ 25 сентября 2011

Нет, ограничения thistype отсутствуют.Эрик Липперт размышляет над этой темой: Curiouser и curiouser .

Обратите внимание, в частности, CRTP (ваше "решение" проблемы)на самом деле не решение

0 голосов
/ 25 сентября 2011

Нет, в C # ничего такого нет. Вам нужно будет использовать самоопределение общего определения класса, если вы хотите сделать это вообще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...