В чем разница между Array и object[] в C#?

Я собирался использовать Enum.GetValues() как обычно, и начал задаваться вопросом, почему он возвращает System.Array вместо object[]. Это как-то связано с ?

это привело к вопросу, в чем разница между Array и object[], если таковые имеются?

Я знаю Array можно использовать для статических методов пока T[] не может, но есть ли разница для экземпляров? Кажется,у них одинаковые методы/свойства экземпляра.

если нет разница, почему Enum.GetValues() return Array вместо object[]?

1 ответов


я собирался использовать Enum.GetValues() как обычно, и начал задаваться вопросом, почему он возвращает System.Array вместо object[].

, потому что object[] будет поле всех значений. Нам нужен массив самих значений, а не их коробочные версии.

единственный способ представить это в общем в pre-generics C# является Array. Помните, что API был в первой версии CLR, которой не хватало дженериков.

там несколько лучших возможных дизайнов в мире с дженериками.

честно говоря, есть лучшие образцы в мире без дженериков, тоже. Два, которые сразу приходят на ум: (1) это мог быть метод экземпляра на Type, (2) компилятор C# мог сгенерировать public static MyEnum[] GetValues() метод для каждого перечислимого типа.

это как-то связано с атрибутом ComVisible?

насколько мне известно, нет.

что есть разница между Array и object[], если таковые имеются?

я не знаю, как ответить на вопросы "в чем разница". Если бы я спросил вас: "в чем разница между жирафом и млекопитающим?- как бы вы ответили? Странный вопрос.

Array базовый класс object[] - это лучшее, что я могу вам сказать.

я знаю 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() скорее всего, вы делаете что-то не так.

в любом случае, я не вижу, какое это имеет отношение к твоему вопросу. Вы можете уточнить вопрос?

если нет никакой разницы, почему перечисление.GetValues () возвращает массив вместо object[]?

этот вопрос бессвязный. Если вы сказали мне, что" Белый дом "и" Пенсильвания-авеню 1600 "были одним и тем же адресом, и я тогда сказал:" Ну, если нет никакой разницы, то почему президент Трамп живет в Белом доме вместо Пенсильвания-авеню 1600?- как ты ответишь на мой безумный вопрос? если нет никакой разницы, то нет никакой разницы, так почему это имеет значение?

в этом случае вопрос основан на ложной предпосылке, как object[] и Array are разные. Но на этот вопрос нельзя ответить.