我有以下对象体系结构:
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]'.
我不理解,因为AlarmImplementation
是IAlarmItem
的实现(通过AlarmItemRangedBase
的类层次结构(,而IConfigAlarmRanged
是IConfigAlarmBase
的子级。对我来说,这应该是一个向下转换,因为所有的类都是从基本类派生的。
但我好像错了。当编译器替换模板时,是否可能忽略模板化类型之间的关系,将泛型类型视为特定类型?
谢谢你对这个问题的考虑。
您的列表是List<IAlarmItem<IConfigAlarmBase>>
,并且您试图添加一个AlarmItemRangedBase<IConfigAlarmRanged>
,因此即使IConfigAlarmRanged
继承自IConfigAlarmBase
,也存在类型不匹配,因为IAlarmItem<IConfigAlarmBase>
和IAlarmItem<IConfigAlarmRanged>
不是同一类型:它们是两个不同的封闭构造泛型类型,不能从一个类型强制转换到另一个类型。
例如,List<string>
和List<int>
是不同的类型,它们之间没有层次结构,也没有可用的侧转换。
泛型-开放和封闭构造类型
关于C#中真泛型多态性的缺失和菱形算子的缺失