Почему у распакованных типов есть методы? - PullRequest
1 голос
/ 27 октября 2011

Почему вы можете делать такие вещи, как

int i = 10;
i.ToString();
'c'.Equals('d');
1.ToString();
true.GetType();

в C #?Эти вещи прямо там или примитивны, буквальны, без коробки, или в любой комбинации этих вещей;так почему у них есть методы? Они не являются объектами и поэтому не должны иметь методов.Является ли этот синтаксис сахаром для чего-то еще?Если да, то?Я могу понять наличие функций, которые делают эти вещи, например:

string ToString(int number)
{
  // Do mad code
  return newString;
}

, но в этом случае вы бы назвали это функцией, а не методом:

string ranch = ToString(1);

Что происходитздесь?

edit:

Просто понял, что C # больше не является клоном Java, и правила совершенно другие.упс: P

Ответы [ 4 ]

6 голосов
/ 27 октября 2011

Они действуют так, потому что спецификация так говорит (и это очень приятно):

1.28 Типы значений

Тип значения - это либо тип структуры, либо тип перечисления.C # предоставляет набор предопределенных структурных типов, называемых простыми типами.Простые типы идентифицируются с помощью зарезервированных слов.

...

1.28.4 Простые типы

C # предоставляет набор предопределенных структурных типов, называемыхпростые типы.Простые типы идентифицируются с помощью зарезервированных слов, но эти зарезервированные слова являются просто псевдонимами для предопределенных структурных типов в пространстве имен System, как описано в таблице ниже.

...

Поскольку простой тип имеет псевдоним типа структуры, каждый простой тип имеет члены.Например, int имеет члены, объявленные в System.Int32, и члены, унаследованные от System.Object, и разрешены следующие операторы:

int i = int.MaxValue; // System.Int32.MaxValue constant
string s = i.ToString(); // System.Int32.ToString() instance method
string t = 123.ToString(); // System.Int32.ToString() instance method

Простые типы отличаются от других типов структуры тем, что они разрешают определенныедополнительные операции:

Большинство простых типов позволяют создавать значения путем написания литералов (§1.16.4).Например, 123 является литералом типа int, а 'a' - литералом типа char.C # не предусматривает литералов структурных типов в целом, и значения по умолчанию других структурных типов в конечном итоге всегда создаются через конструкторы экземпляров этих структурных типов.

Как поясняется в спецификации, простые типы имеют некоторые значения super powers как способность быть const, специальный литеральный синтаксис, который можно использовать вместо нового, и способность вычисляться во время компиляции (2 + 2 фактически записывается как 4 в конечном потоке MSIL)

Но методы (а также операторы) не являются особыми сверхспособностями, и все структуры могут иметь их.

Спецификация (для C # 4.0 моя копия вставлена ​​из более ранней версии)) можно загрузить с веб-сайта Microsoft: C # Language Specification 4.0

6 голосов
/ 27 октября 2011

Недавняя статья Эрика Липперта Наследование и представление объясняет. (Спойлер: Вы путаете наследование и представление.)

Не уверен, почему вы утверждаете, что целое число i, символ 'c' и целое число 1 не являются объектами. Они есть.

2 голосов
/ 27 октября 2011

В C # все примитивные типы на самом деле являются структурами.

0 голосов
/ 27 октября 2011

Чтобы вы могли их использовать!

Это удобно делать, так что вы можете.

Теперь, чтобы сделать это, примитивы можно рассматривать как структуры.Например, 32-разрядное целое число может быть обработано как 32-разрядное целое число, но оно также может быть обработано как public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<int>, IEquatable<int>.В основном мы получаем лучшее из обоих миров.

...