为什么在类 P 的类型参数 T 的泛型约束为“必须从 A 继承”的情况下,第一次调用会成功,但第二次调用会失败,并出现注释中详细说明的类型转换错误:
abstract class A { }
static class S
{
public static void DoFirst(A argument) { }
public static void DoSecond(ICollection<A> argument) { }
}
static class P<T>
where T : A, new()
{
static void Do()
{
S.DoFirst(new T()); // this call is OK
S.DoSecond(new List<T>()); // this call won't compile with:
/* cannot convert from 'System.Collections.Generic.List<T>'
to 'System.Collections.Generic.ICollection<A>' */
}
}
通用约束不应该确保List<T>
确实ICollection<A>
?
这是 C# 缺乏的一个例子协方差关于泛型类型(C#does支持数组协方差)。 C# 4 将在接口类型上添加此功能,并且还将更新多个 BCL 接口类型以支持它。
请参见C# 4.0:协变和逆变:
在这篇文章中,我将尝试介绍一个
C# 4.0 创新。中的一个
新特征是协方差和
类型参数的逆变
现在由通用代表支持
和通用接口。首先让我们
看看这些词是什么意思:)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)