繁体   English   中英

C#协方差泛型参数分配/发布(隐式转换)

[英]C# Covariance generic parameter assignment/casting (implicit conversion)

我有一个界面:

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;

最后一句抛出异常,告诉您无法进行强制转换。

通用接口的收敛性和矛盾性仅适用于引用类型。 TimeSpan是一种值类型,因此IInterface<string, TimeSpan>无法转换为IInterface<string, object>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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