我正在尝试构建一个泛型类型,它在初始化类型T1的实例时接受并在其方法中接受类型为T2的实例。
所以,现在我有一个泛型方法,其中可接受的类型有一个约定 - 是一个抽象类的子类,我有这个抽象类型实例的内部集合:
private readonly IList<Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>> _history;
public bool Invoke<TInitiator, TParameter>(CommandBase<TInitiator, TParameter> command, TParameter parameter)
where TInitiator : SocialNetworkUnit
where TParameter : SocialNetworkUnit
{
var success = command.Run(parameter);
this._history.Add(new Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>(command, parameter));
}
但我有一个编译错误,说TInitiator-和TParameter-参数(约定为SocialNetworkUnit)不能用于收集。
Argument 1: cannot convert from 'CommandUnits.CommandBase<TInitiator,TParameter>' to 'CommandUnits.CommandBase<Command.SNUnit.SocialNetworkUnit,Command.SNUnit.SocialNetworkUnit>'
你能告诉我我的错误吗?
谢谢
答案 0 :(得分:0)
CommandBase
与这两个通用参数不一致。它需要协变才能工作,并且在C#类中不能协变,只有接口可以。如果您创建一个将这两个通用参数都作为协变的接口,并在您拥有的列表中使用该接口而不是CommandBase
,那么代码就可以工作。
答案 1 :(得分:-1)
尝试显式演员:
this._history.Add(new Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>(command as CommandBase<SocialNetworkUnit, SocialNetworkUnit>, parameter));