我有一个简单的泛型委托:

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


尽管这样做确实可行,但我无法强制将传递给Execute的TCommand设置为当前对象的类型(派生自更多的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可以处理的吗?

也许已经有了解决问题的模式?

最佳答案

不,没有thistype约束。埃里克·利珀特(Eric Lippert)在这里有一些关于这个话题的困惑:Curiouser and curiouser

请特别注意,CRTP(问题的“解决方案”)实际上不是解决方案。

09-27 21:58