这个问题已经在这里有一个答案:
- 如何从值类型派生的对象(引用类型),仍然是值类型? 6个回答
int a = 2;
Console.WriteLine(a.ToString()); // displays 2
// definition of ToString() here - public override string ToString();
现在,这里有一些我认识的:
- 在.NET中的所有类获得
ToString()
方法,它是从继承的Object
类。 - 的结构不能从一类或另一个结构衍生。
int
是类型的结构Int32
,它获取几个ToString()
[随着参数]从它实现的接口方法。 - 还有一个
ToString()
[未经PARAMS]在结构功能Int32
据http://msdn.microsoft.com/en-us/library/system.int32.tostring.aspx ,
结构的Int32覆盖ValueType.ToString()方法
如果结构不能继承某些类或结构,能否请您解释一下这是如何ToString()
方法可用于Int32
?
如果结构不能继承某些类或结构,
这是不正确的。 所有的结构(和内置的值类型,如System.Int32
, System.Single
等)总是隐继承System.ValueType
(这反过来,从继承System.Object
)。
但是,你不能让从别的继承的结构。
这显然是在C#语言规范,4.1.1规定了:
4.1.1 System.ValueType类型
所有的值类型隐式地从类System.ValueType,这反过来,从类object继承。 这是不可能的任何类型从一个值类型派生,和值类型由此隐式密封(第10.1.1.2节)。
然后,更新版本(4.1.3)结构被明确地定义为一个值类型:
4.1.3结构类型
结构类型为值类型,它可以声明常量,字段,方法,属性索引,操作符,实例构造函数,静态构造,和嵌套类型。
Int32
实现IFormattable
,它定义了ToString
方法
自ValueType派生的类型的每一个定义实际上定义了两种不同类型的东西,在运行时:一个类型堆对象(其从派生ValueType
和反过来从Object
,并且其包含嵌入类型信息),和一个型存储位置(它不包含任何嵌入的类型信息,而是要求它使用它必须知道它是什么)的一些其他方式的代码。 堆对象类型的实例包含存储位置类型的字段,以及代码试图访问this
将访问该字段。 如果值类型隐含或明确地转换为引用类型的存储位置时,系统会创建具有相应类型的新堆对象和值类型的所有公共和私人领域的复制到堆对象中的相应字段。 如果堆对象转换为数值型的存储位置,从堆对象的所有公共和私人领域将被复制到价值型存储位置。
如果试图使用任何Object
或接口方法的值类型的堆对象上,该方法将被调用,就像任何其他堆对象的方法。 如果试图在一值型存储位置制成,比其他任何方法GetType
,编译器会生成一个特殊的“约束”操作码,其通知所述存储位置的类型的运行时和指示运行时调用的地址适合于该类型的方法。 由于编译器将具有可用的存储位置的类型,以及在运行时可以用它来找出合适的方法,适当的方法,可直接上的存储位置被调用,而不必首先创建一个新的堆对象。 GetType
是一个明显的例外; 因为它通过检查嵌入对象中的类型信息,它只能对已嵌入式信息工作的事情。 因此,它的参数将被转换为在呼叫前堆对象形式; GetType
然后将能够检查该堆物件的嵌入类型信息。
文章来源: If a struct cannot inherit another class or struct, why does Int32 have a ToString() method? [duplicate]