【发布时间】:2011-01-10 23:52:38
【问题描述】:
我定义了以下类:
public abstract class AbstractPackageCall
{
...
}
我还定义了这个类的一个子类:
class PackageCall : AbstractPackageCall
{
...
}
AbstractPackageCall还有其他几个子类
现在我想拨打以下电话:
List<AbstractPackageCall> calls = package.getCalls();
但我总是遇到这个异常:
Error 13 Cannot implicitly convert type 'System.Collections.Generic.List<Prototype_Concept_2.model.PackageCall>' to 'System.Collections.Generic.List<Prototype_Concept_2.model.AbstractPackageCall>'
这里有什么问题?这是方法包#getCalls
internal List<PackageCall> getCalls()
{
return calls;
}
【问题讨论】:
-
它被称为泛型的协变/逆变。查看this SO question。
-
如果您可以返回
IEnumerable<AbstractPackageCall>而不是List<AbstractPackageCall>,那么这将起作用,因为IEnumerable<>支持协方差。 -
您可能也有兴趣阅读这两个网站。阅读这篇文章让我点击了C# 4.0 FEATURE FOCUS – PART 4 – CO- AND CONTRA-VARIANCE FOR GENERIC DELEGATE AND INTERFACE TYPES,当然Eric Lippert 有很多关于这个主题的帖子。
-
感谢大家的解答,终于明白协方差的概念了。
标签: c# .net generics covariance