将当前对象引用为泛型类型的关键字
本文关键字:泛型类型 关键字 对象引用 | 更新日期: 2023-09-27 18:09:31
我有一个简单的通用委托:
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关于这个话题的一些思考:好奇和好奇。
特别注意,CRTP(问题的"解决方案")实际上并不是一个解决方案。
不,c#中没有这样的东西。如果你想这样做,你将不得不使用你的自引用泛型类定义。