繁体   English   中英

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

[英]Since Int32 is a value type why does it inherit .ToString()?

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

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

然而,它进一步说明:

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

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

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

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

System.Object
   System.ValueType
      System.Int32

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

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

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

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

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

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

UML

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

文档是错误的。 引用和值类型都从对象继承该行为(但请记住, 并非.NET中的所有内容都是从对象派生的类 )。

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

我认为你的问题的简短答案是值类型继承自System.ValueType ,而继承自object。

每个struct都具有System.ValueType(不允许)的继承,该类仅由编译器完成。 所有struct都有来自ValueType基类的方法,它继承自Object类,使我们可以访问ToString()和所有其他类。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM