C#CastingGenericType我有一个泛型接口IConstrained,它是由泛型Constrained类实现的。当我尝试执行下面的代码时,我得到了一个无效的转换异常。IConstraineddecimalLimit=newConstrained(1);IConstrainedcomparableLimit=(IConstrained)decimalLimit;如果decimal实现了IComparable,为什么它不能这样做呢?这样做的正确方法是什么?谢谢。.NET2.0中的泛型类型不是协变的。这包括.NET3.0/3.5,因为它们使用相同的2.0运行时。但是,.NET4.0将支持协变。将IConstrained转换为IConstrained称为协方差。你不能在C#3中这样做。但是,它会出现在C#4中。ErikLippert有一系列博客文章详细介绍了逆变和协变。要解决此问题,您必须在使用时将十进制数转换为IComparable。这是与C#(以及其他具有泛型的语言)的共同旅程。在C#中,您只能强制转换为类层次结构(超类、子类)中的类。但是IConstrained既不是IConstrained的超类也不是IConstrained的子类,即使decimal实现了IComparable。C#不允许这样做的原因是因为允许它意味着你可以做非常糟糕的事情。有关为什么会这样的详细解释,请查看类似的问题对于像这样的IConstrained和IConstrained类,它需要实现两个接口IConstrained和IConstrainedclassA:IConstrained,IConstrainedItdoesn'thappenautomaticallybecause.NET2.0不实现协议方差或逆变。IConstrained不实现IConstrained。是的,这令人沮丧且违反直觉。据我了解,这实际上将在C#4.0中以一种或另一种形式得到支持。它被称为协变或逆变。编辑:我不熟悉Constrained类,但您可以构造一个新的Contrained并将其传递给小数。如果它具有Constrained(TcopyFrom)形式的构造函数,那么您可以声明一个新的Constrained并将小数传递给它。有点像复制。编辑2:在此页面的一半左右,搜索“2.0”,有一个如何在.NET2.0中解决此问题的示例:http://blog.tlk.com/dot-net/2009/c-sharp-4-协变和-逆变这是“怎么做”的答案。IListdecimalLimit=newList(1);IEnumerableasComparable=decimalLimit.Cast();IListcomparableLimit=asComparable.ToList();对于泛型,具有不同类型参数的相同泛型类型的两个实例彼此没有直接关系。换句话说:IConstrained!==IConstrained这是一个方差问题。尽管decimal是IComparable,但IConstrained不是IConstrained。我相信这种自动转换在C#4.0下是可能的,并且具有改进的协变性。但这在C#3.0或更早版本中是不可能的。阅读有关逆方差和协方差的信息。意识到C#泛型是不可变的,您所要求的并不是您想要的。以上就是C#学习教程:C#CastingGenericType分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
