将接口类型转换为实现它的类型失败?

时间:2019-03-08 12:27:01

标签: c#

我有一个实现EaterIComparable的类IComparable<Eater>。然后,我生成一个类型为IComparable[]的数组。现在,由于Eater实现了IComparable,因此我认为以下转换有效:

Eater[] = (Eater[])(new IComparable[] {1,2,3})

但是,此操作失败并显示InvalidCastException-为什么以及如何修改代码以使其变为可能?

2 个答案:

答案 0 :(得分:2)

猫是动物。但并非所有动物都是猫。

或者为您:

食者是一个IComparable。但是并非所有实现IComparable的类都是Eater。

new IComparable[] {1,2,3}所做的是创建和创建Int32数组(它也实现了IComparable。但是Int32不是Eater。)

类似的东西应该可以工作:

Eater[] = (Eater[])(new IComparable[] {new Eater(1),new Eater(2), new Eater(3)})

Eater[] = new Eater[] {new Eater(1),new Eater(2), new Eater(3)}

答案 1 :(得分:-1)

如果Eater实现了IComparable,则意味着您可以将Eater强制转换为ICompatable

但是,当您将IComparable投射到Eater时,您正尝试以另一种方式进行操作。

您可以像IComparable[] arr = new Eater[] { 1, 2, 3}