繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM