2015-02-23 115 views
0

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

你能告诉我我的错误吗?

感谢

回答

-1

尝试进行明确的转换:

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

这只会使它在运行时失败。 (或者简单地说它总是'空',因为你错误地使用了'as'。) – Servy 2015-02-23 21:42:59

0

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