.ToString()
提示此问题的These are the docs。他们说:
因为Object是.NET中所有引用类型的基类 框架,此行为[.ToString()]由不具有的引用类型继承 覆盖ToString方法。
进一步说明:
例如,Char,Int32和String等基类型提供了ToString实现
然而,Int32是 struct ,因此必须是值类型。
那么这里发生了什么? Int32是否实现了它自己的.ToString(),它与Object无关?
答案 0 :(得分:13)
Int32是一个结构,因此是一个值类型。 但是:
System.Object
System.ValueType
System.Int32
Int32派生自System.ValueType,它本身派生自System.Object。 Etvoilà......
答案 1 :(得分:11)
是的,Int32
会覆盖ToString
...虽然这在某种程度上与此无关。 所有类型都会继承object
的成员 - 您可以始终调用ToString()
,您可以始终调用{{1}等等(Equals
会覆盖ValueType
和Equals
,但您应该在结构中进一步覆盖它们以提供更有效的实现。)
请注意,您可以非常轻松地自行覆盖这些方法:
GetHashCode
目前尚不清楚哪个方面让您感到困惑(这里涉及的领域不同)。如果你能澄清一下,我们可以解决具体问题。
答案 2 :(得分:5)
也许你因为没有意识到价值类型继承自Object
而产生了混淆?以下是System.Object
,System.ValueType
,System.Int32
和MyNamespace.Customer
的继承图,它应该是您自己制作的类。我很懒,并没有编写Int32
的所有公共方法和接口。
ToString
在Object
中声明,但在ValueType
和Int32
中都被覆盖。
答案 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
类,但它具有覆盖的特殊实现。