[英]Understanding a type assigning when using generics methods/types
我正在尝试构建一个通用类型,该类型将在初始化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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.