我有一个简单的泛型委托:
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(问题的“解决方案”)实际上不是解决方案。