在使用泛型方法/类型时理解类型赋值



我正在尝试构建一个泛型类型,该类型将在初始化类型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>'

你能告诉我我的错误吗

感谢

CommandBase相对于这两个泛型参数不是协变的。它需要是协变的才能工作,而在C#类中不能是协变,只有接口可以是。如果你创建了一个接口,它将这两个泛型参数都作为协变参数,并在你的列表中使用该接口而不是CommandBase,那么代码就可以工作了。

尝试显式强制转换:

this._history.Add(new Tuple<CommandBase<SocialNetworkUnit, SocialNetworkUnit>, SocialNetworkUnit>(command as CommandBase<SocialNetworkUnit, SocialNetworkUnit>, parameter));

最新更新