int a = 2;
Console.WriteLine(a.ToString()); // displays 2
// definition of ToString() here - public override string ToString();
现在,这是我的一些理解:
ToString()
方法,该方法从Object
类继承而来。int
是一种Int32
类型的结构,它从接口中获取几个带参数的方法,它在结构Int32
中也是一个不带参数函数的ToString()
根据http://msdn.microsoft.com/en-us/library/system.int32.tostring.aspx的说法,
结构Int32覆盖ValueType.ToString()方法
如果一个结构不能继承某些类或结构,您能解释一下这个ToString()
方法如何可用于Int32
吗
发布于 2012-05-24 04:16:06
如果结构不能继承某些类或结构,
这不是真的。所有结构(以及内置值类型,如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结构类型
结构类型是可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型的值类型。
发布于 2012-05-24 04:17:23
Int32
实现了定义ToString
方法的IFormattable
发布于 2012-10-08 23:53:34
从ValueType派生的每个类型定义实际上在运行库中定义了两种不同的东西:堆对象类型(从ValueType
派生,再从Object
派生,并包含嵌入式类型信息)和存储位置类型(不包含任何嵌入式类型信息,但要求使用它的代码必须有其他方式知道它是什么)。堆对象类型的实例包含存储位置类型的字段,尝试访问this
的代码将访问该字段。如果值类型被隐式或显式地转换为引用类型的存储位置,则系统将创建一个具有适当类型的新堆对象,并将该值类型的所有公共和私有字段复制到堆对象中的相应字段。如果堆对象被强制转换为值类型的存储位置,则堆对象中的所有公共和私有字段都将复制到值类型的存储位置。
如果试图在值类型的堆对象上使用任何Object
或接口方法,则将像调用任何其他堆对象方法一样调用该方法。如果在值类型的存储位置上进行尝试,则对于GetType
以外的任何方法,编译器将生成一个特殊的“受约束”操作码,该操作码通知运行时存储位置的类型,并指示运行时调用适合于该类型的方法的地址。由于编译器将具有可用的存储位置类型,并且运行时可以使用该类型来查找适当的方法,因此可以直接在存储位置上调用适当的方法,而不必首先创建新的堆对象。GetType
是一个值得注意的例外;因为它是通过检查对象中嵌入的类型信息来工作的,所以它只能处理嵌入了类型信息的对象。因此,在调用之前,其参数将被转换为堆对象形式;然后,GetType
将能够检查该堆对象的嵌入类型信息。
https://stackoverflow.com/questions/10727151
复制相似问题