C# 将接口类型转换为实现它的类型失败?
我有一个类C# 将接口类型转换为实现它的类型失败?,c#,C#,我有一个类Eater,它实现了IComparable和IComparable。然后我生成一个类型为IComparable[]的数组。现在因为Eater实现了IComparable,我认为以下转换是有效的: Eater[]=(Eater[])(新的IComparable[]{1,2,3}) 但是,如果InvalidCastException,则此操作失败-为什么以及如何修改代码以使其成为可能?如果Eater实现IComparable,则意味着您可以将Eater强制转换为IComparable 但是
Eater
,它实现了IComparable
和IComparable
。然后我生成一个类型为IComparable[]
的数组。现在因为Eater
实现了IComparable
,我认为以下转换是有效的:
Eater[]=(Eater[])(新的IComparable[]{1,2,3})
但是,如果
InvalidCastException
,则此操作失败-为什么以及如何修改代码以使其成为可能?如果Eater
实现IComparable
,则意味着您可以将Eater
强制转换为IComparable
但是,当您将IComparable
转换为Eater
时,您正试图以另一种方式进行转换
你可以做一些类似的事情,比如猫是一种动物。但并不是所有的动物都是猫 或者为您: 食客是一个不可比的人。但并不是所有实现IComparable的类都是Eater
而
newicomparable[]{1,2,3}
所做的是创建和数组of(它也实现了IComparable。但Int32不是Eater)
像这样的方法应该会奏效:
Eater[] = (Eater[])(new IComparable[] {new Eater(1),new Eater(2), new Eater(3)})
或
您可以从
Eater[]
数组创建IComparable[]
数组,反之亦然。因为可以肯定的是,Eater
拥有i可比
需要的一切,i可比
并不总是拥有Eater
需要的一切(因为它不仅实现了i可比
)。Eater
将永远是i可比的。但是IComparable
并不总是Eater
。可能相关的旁注:您可以将Eater数组转换为IComparable[]
(正如其他人已经指出的那样),但这并不能将Eater数组转换为真正的IComparable数组。它的核心仍然是一个Eater数组,即使您可以将其转换为IComparable[]
,它也不允许将Eater以外的对象放入其中…newicomparable[]{1,2,3}
包含一个指向装箱整数的IComparable
引用数组。
Eater[] = new Eater[] {new Eater(1),new Eater(2), new Eater(3)}