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

m.e*_*son 10 .net c# tostring value-type reference-type

这些是关于.ToString()这个的文档提出了这个问题.他们说:

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

然而,它进一步说明:

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

但是Int32是一个结构,因此必须是值类型.

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

小智 13

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

System.Object
   System.ValueType
      System.Int32
Run Code Online (Sandbox Code Playgroud)

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

  • @Andreas Niedermair:根据规范,这不合法.规范明确说明你不能从`System.ValueType`明确地派生出来,并且有一个特殊的保留字`struct`来完成这个,当你用它来标记一个类型定义时,你只能列出那些接口类型实现但不是基类(同样,它隐式派生自`System.ValueType`). (4认同)

Jon*_*eet 11

是的,Int32覆盖ToString......虽然这在某种程度上与此无关.所有类型都继承成员object- 你可以随时调用ToString(),你可以随时调用Equals等等(ValueType覆盖EqualsGetHashCode为你,尽管你应该在结构中进一步覆盖它们以提供更有效的实现.)

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

public struct Foo
{
    public override string ToString()
    {
        return "some dummy text";
    }
}
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*age 5

也许你因为没有意识到价值类型继承而产生混淆Object?这里的继承图System.Object,System.ValueType,System.Int32MyNamespace.Customer这应该是一个类,你自己造成的.我很懒,并没有编写所有公共方法和接口Int32.

UML

ToString声明Object但在内部ValueType和内部都被覆盖Int32.