C#:将具有派生接口的泛型对象向下转换为基接口

  • 本文关键字:接口 对象 转换 泛型 派生 c#
  • 更新时间 :
  • 英文 :


我有以下对象体系结构:

public interface IConfigAlarmBase{}
public interface IConfigAlarmBinary:IConfigAlarmBase{}
public interface IConfigAlarmRanged:IConfigAlarmBase{}
public interface IAlarmItem<TConfig> where TConfig : IConfigAlarmBase{}
public abstract class AlarmItemBase<TConfig> : IAlarmItem<TConfig> where TConfig :IConfigAlarmBase {}
public abstract class AlarmItemBinaryBase:AlarmItemBase<IConfigAlarmBinary>{}
public abstract class AlarmItemRangedBase<TConfig> : AlarmItemBase<TConfig> where TConfig:IConfigAlarmRanged{}
public class AlarmImplementation:AlarmItemRangedBase<IConfigAlarmRanged>

然后是AlarmItemBinaryBase对象及其兄弟AlarmItemRangedBase的一些实现。

我想将所有警报存储在一个列表中,该列表将被定义为:List<IAlarmItem<IConfigAlarmBase>>

但当我实例化我的列表并尝试填充它时,我会得到一个错误:

System.InvalidCastException: Unable to cast object of type 'Alarm.Implementations.AlarmImplementation' to type 'Common.Application.Alarm.IAlarmItem`1[Common.Config.Alarms.IConfigAlarmBase]'.

我不理解,因为AlarmImplementationIAlarmItem的实现(通过AlarmItemRangedBase的类层次结构(,而IConfigAlarmRangedIConfigAlarmBase的子级。对我来说,这应该是一个向下转换,因为所有的类都是从基本类派生的。

但我好像错了。当编译器替换模板时,是否可能忽略模板化类型之间的关系,将泛型类型视为特定类型?

谢谢你对这个问题的考虑。

您的列表是List<IAlarmItem<IConfigAlarmBase>>,并且您试图添加一个AlarmItemRangedBase<IConfigAlarmRanged>,因此即使IConfigAlarmRanged继承自IConfigAlarmBase,也存在类型不匹配,因为IAlarmItem<IConfigAlarmBase>IAlarmItem<IConfigAlarmRanged>不是同一类型:它们是两个不同的封闭构造泛型类型,不能从一个类型强制转换到另一个类型。

例如,List<string>List<int>是不同的类型,它们之间没有层次结构,也没有可用的侧转换。

泛型-开放和封闭构造类型

关于C#中真泛型多态性的缺失和菱形算子的缺失

最新更新