C# 协方差泛型参数赋值/强制转换(隐式转换)

本文关键字:转换 方差 泛型 参数 赋值 | 更新日期: 2023-09-27 18:36:05

我有一个接口:

interface IInterface<T1, out T2> {};

抽象类实现IInterface<>

abstract class AbsClass<T2> : IInterface<String, T2> {};

和其他抽象类继承自AbsClass<>

abstract class AbsAbsClassString : AbsClass<String, String> {};
abstract class AbsAbsClassTimeSpan : AbsClass<String, TimeSpan> {};

最后,

class CClassString1 : AbsAbsClassString {};
class CClassString2 : AbsAbsClassString {};
class CClassTimeSpan1 : AbsAbsClassTimeSpan {};
class CClassTimeSpan2 : AbsAbsClassTimeSpan {};
// and so on...

在我的 C3 代码中,我声明了一个List<IInterface<String, Object>>

IList<IInterface<String, Object>> list = new List<IInterface<String, Object>>();
list.Add(new CClassString1());
list.Add(new CClassString2());
list.Add(new CClassTimeSpan1());
list.Add(new CClassTimeSpan2());

在每个list.Add(*)句子中,编译器告诉我:

最佳重载方法匹配'System.Collections.Generic.ICollection(IInterface(String,object))。Add(IInterface(String,object))' 有一些无效的参数

参数 1:不能将类型 CClassString1 隐式转换为 IInterface(String,object)。存在显式转换(您是否缺少强制转换?

如果我测试:

IInterface<String, Object> i;
CClassString1 cs1 = new CClassString1();
i = (Interface<String,Object>)cs1;

最后一句话抛出了一个例外,告诉它不可能做演员。

C# 协方差泛型参数赋值/强制转换(隐式转换)

泛型接口方差和逆变仅适用于引用类型。 TimeSpan 是值类型,因此不能将IInterface<string, TimeSpan>强制转换为 IInterface<string, object>

这是因为变体强制转换是引用转换 - 它们不会更改对象的表示形式,只会更改引用的编译时类型。