Поскольку Int32 является типом значения, почему он наследует .ToString ()? - PullRequest
10 голосов
/ 16 ноября 2011

Это документы о .ToString(), которые вызвали этот вопрос.Они заявляют:

Поскольку Object является базовым классом всех ссылочных типов в .NET Framework, это поведение [.ToString ()] наследуется ссылочными типами, которые не переопределяют метод ToString.

Более того, он переходит в состояние:

Например, базовые типы, такие как Char, Int32 и String, предоставляют реализации ToString

Однако Int32 является struct и, следовательно, должно быть типом значения .

Так что здесь происходит?Реализует ли Int32 свой собственный метод .ToString (), который не имеет ничего общего с Object?

Ответы [ 6 ]

13 голосов
/ 16 ноября 2011

Int32 является структурой и, следовательно, типом значения. Но:

System.Object
   System.ValueType
      System.Int32

Int32 является производным от System.ValueType, а само это происходит от System.Object. Et voilà ...

11 голосов
/ 16 ноября 2011

Да, Int32 переопределяет ToString ... хотя здесь это не имеет никакого значения. Все типы наследуют члены object - вы можете всегда звонить ToString(), вы можете всегда звонить Equals и т. Д. (ValueType переопределяетEquals и GetHashCode для вас, хотя вы почти всегда должны переопределять их в структурах, чтобы обеспечить более эффективную реализацию.)

Обратите внимание, что вы можете переопределить методы самостоятельно очень легко:

public struct Foo
{
    public override string ToString()
    {
        return "some dummy text";
    }
}

Непонятно, какой аспект вас смущает (здесь задействовано довольно много разных областей).Если бы вы могли уточнить, мы могли бы решить конкретную проблему.

5 голосов
/ 16 ноября 2011

Возможно, вы путаете с тем, что не понимаете, что типы значений наследуются от Object?Вот график наследования System.Object, System.ValueType, System.Int32 и MyNamespace.Customer, который должен быть классом вашего собственного создания.Я был ленив и не написал все общедоступные методы и интерфейсы Int32.

UML

ToString объявлено в Object, но переопределяется как в ValueType и в Int32.

0 голосов
/ 16 ноября 2011

Каждый struct имеет наследование от System.ValueType класса (не разрешено) , что выполняется исключительно компилятором.Все struct имеют методы из ValueType базового класса, который унаследован от Object класса, дает нам доступ к ToString() и всем остальным.

Несмотря на то, что ValueType наследуется от Object классано он имеет специальную реализацию переопределений.

0 голосов
/ 16 ноября 2011

Я думаю, что короткий ответ на ваш вопрос заключается в том, что типы значений наследуются от System.ValueType , а это в свою очередь наследует от объекта.

0 голосов
/ 16 ноября 2011

Документы неверны.И ссылочный тип, и тип значений наследуют это поведение от объекта (но помните, что не все в .NET - это класс, производный от объекта ).

Все (большинство?) Типы основных значений переопределяютToString () для возврата чего-то более разумного, чем имя класса.

...