了解使用泛型方法/类型时的类型分配

时间:2015-02-23 21:34:43

标签: c# generics

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

你能告诉我我的错误吗?

谢谢

2 个答案:

答案 0 :(得分:0)

CommandBase与这两个通用参数不一致。它需要协变才能工作,并且在C#类中不能协变,只有接口可以。如果您创建一个将这两个通用参数都作为协变的接口,并在您拥有的列表中使用该接口而不是CommandBase,那么代码就可以工作。

答案 1 :(得分:-1)

尝试显式演员:

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