由于Int32是一个值类型,为什么它继承.ToString()?

时间:2011-11-16 13:54:30

标签: c# .net tostring value-type reference-type

关于.ToString()提示此问题的

These are the docs。他们说:

  

因为Object是.NET中所有引用类型的基类   框架,此行为[.ToString()]由不具有的引用类型继承   覆盖ToString方法。

进一步说明:

  

例如,Char,Int32和String等基类型提供了ToString实现

然而,Int32是 struct ,因此必须是值类型

那么这里发生了什么? Int32是否实现了它自己的.ToString(),它与Object无关?

6 个答案:

答案 0 :(得分:13)

Int32是一个结构,因此是一个值类型。 但是:

System.Object
   System.ValueType
      System.Int32

Int32派生自System.ValueType,它本身派生自System.Object。 Etvoilà......

答案 1 :(得分:11)

是的,Int32会覆盖ToString ...虽然这在某种程度上与此无关。 所有类型都会继承object的成员 - 您可以始终调用ToString(),您可以始终调用{{1}等等(Equals会覆盖ValueTypeEquals,但您应该在结构中进一步覆盖它们以提供更有效的实现。)

请注意,您可以非常轻松地自行覆盖这些方法:

GetHashCode

目前尚不清楚哪个方面让您感到困惑(这里涉及的领域不同)。如果你能澄清一下,我们可以解决具体问题。

答案 2 :(得分:5)

也许你因为没有意识到价值类型继承自Object而产生了混淆?以下是System.ObjectSystem.ValueTypeSystem.Int32MyNamespace.Customer的继承图,它应该是您自己制作的类。我很懒,并没有编写Int32的所有公共方法和接口。

UML

ToStringObject中声明,但在ValueTypeInt32中都被覆盖。

答案 3 :(得分:0)

文档错了。引用和值类型都从对象继承该行为(但请记住not everything in .NET is a class that derives from object)。

所有(大多数?)核心值类型重写ToString()以返回比类名更合理的东西。

答案 4 :(得分:0)

我认为对您的问题的简短回答是,值类型继承自System.ValueType,而后者继承自对象。

答案 5 :(得分:0)

每个struct都有System.ValueType class (不允许)的继承,这完全由编译器完成。所有struct都有来自ValueType基类的方法,这些方法继承自Object类,因此我们可以访问ToString()和所有其他类。

尽管ValueType继承自Object类,但它具有覆盖的特殊实现。