10

These are the docs about .ToString() that has prompted this question. They state:

Because Object is the base class of all reference types in the .NET Framework, this behavior [.ToString()] is inherited by reference types that do not override the ToString method.

Yet further on it goes to state:

For example, the base types such as Char, Int32, and String provide ToString implementations

However Int32 is a struct and hence must be a value type.

So what's going on here? Does Int32 implement it's very own .ToString() which has nothing to do with Object?

4

6 回答 6

13

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

System.Object
   System.ValueType
      System.Int32

Int32 派生自 System.ValueType,而这本身派生自 System.Object。等等...

于 2011-11-16T13:59:36.283 回答
11

是的,Int32覆盖ToString......虽然这在这里有点无关紧要。所有类型都继承的成员object- 你可以随时调用ToString(),你可以随时调用Equals等(ValueType覆盖EqualsGetHashCode为你,尽管你应该几乎总是在结构中进一步覆盖它们以提供更有效的实现。)

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

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

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

于 2011-11-16T13:57:45.327 回答
5

也许您的困惑是由于没有意识到值类型继承自Object?这是,的继承图System.Object,它应该是你自己制作的一个类。我很懒,没有写所有的公共方法和接口。System.ValueTypeSystem.Int32MyNamespace.CustomerInt32

UML

ToString在 in 中声明,但在 in和 in 中Object都被覆盖。ValueTypeInt32

于 2011-11-16T14:23:10.277 回答
0

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

所有(大多数?)核心值类型都会覆盖 ToString() 以返回比类名更合理的内容。

于 2011-11-16T14:00:57.400 回答
0

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

于 2011-11-16T14:02:47.633 回答
0

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

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

于 2011-11-16T14:09:22.467 回答