Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将接口类型转换为实现它的类型失败?_C# - Fatal编程技术网

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)}