C#中Array和object []有什么区别?

时间:2018-04-04 18:03:00

标签: c# arrays

我正常使用Enum.GetValues(),并开始想知道为什么它会返回System.Array而不是object[]。它与ComVisible属性有关吗?

这导致了一个问题,Arrayobject[]之间有什么区别?

我知道Array可以用于静态方法,而T[]不能但是实例有区别吗?它们似乎具有相同的实例方法/属性。

如果没有差异,为什么Enum.GetValues()会返回Array而不是object[]

1 个答案:

答案 0 :(得分:11)

  

我正常使用Enum.GetValues(),并开始想知道为什么它会返回System.Array而不是object[]

因为object[]会包含所有值。我们想要的是一系列值本身,而不是它们的盒装版本。

在预先泛型C#中表示一般的唯一方法是Array。请记住,该API是CLR的第一个版本,缺少泛型。

在具有仿制药的世界中,有许多更好的设计。

坦率地说,在没有仿制药的世界里,有更好的设计。立即想到的两个是:(1)这可能是Type上的实例方法,(2)C#编译器可能在每个枚举类型上生成public static MyEnum[] GetValues()方法。

  

是否与ComVisible属性有关?

据我所知。

  

Arrayobject[]之间有什么区别?

我不知道如何回答"差异是什么"的问题。如果我问你"长颈鹿和哺乳动物之间的区别是什么?"你会怎么回答呢?这是一个奇怪的问题。

Arrayobject[]的基类,是我能告诉你的最好的。

  

我知道Array可以用于静态方法,而T[]则不能,但是实例有区别吗?

我也不明白这个问题。你能举例说明你的意思吗?"可以用于静态方法"?

也许你的意思是通常你可以从派生类型访问类型的静态成员的奇怪之处,但你不能使用数组类型?也就是说,你可以说:

class B { public static void M() {} } 
class D : B {}
...
B.M();
D.M(); // Same thing

这有效:

Array.Sort(whatever);

但这不起作用:

int[].Sort(whatever);

C#处理成员访问操作符的方式很奇怪,但这是一种奇怪的做法,因为如果你正在输入int[].Sort()赔率非常高,那么你就会感到很伤心。做错了。

无论哪种方式,我都不知道它与你的问题有什么关系。你能澄清这个问题吗?

  

如果没有区别,为什么Enum.GetValues()返回Array而不是object []?

这个问题是不连贯的。如果你告诉我"白宫" " 1600宾夕法尼亚大道"我是同一个地址,然后我说"嗯,如果没有区别,那么为什么特朗普总统住在白宫而不是宾夕法尼亚大道1600号?"你怎么回答我的疯狂问题? 如果没有区别,那么没有区别,那为什么重要?

在这种情况下,问题是基于错误的前提,因为object[]Array 不同。但目前的问题无法回答。