首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果一个结构不能继承另一个类或结构,为什么Int32要有一个ToString()方法?

如果一个结构不能继承另一个类或结构,为什么Int32要有一个ToString()方法?
EN

Stack Overflow用户
提问于 2012-05-24 04:13:37
回答 3查看 9.3K关注 0票数 21
代码语言:javascript
复制
int a = 2;

Console.WriteLine(a.ToString()); // displays 2

// definition of ToString() here - public override string ToString();

现在,这是我的一些理解:

  1. .net中的所有类都获得一个ToString()方法,该方法从Object类继承而来。
  2. 结构不能从类或其他结构派生。int是一种Int32类型的结构,它从接口中获取几个带参数的方法,它在结构Int32

中也是一个不带参数函数的ToString()

根据http://msdn.microsoft.com/en-us/library/system.int32.tostring.aspx的说法,

结构Int32覆盖ValueType.ToString()方法

如果一个结构不能继承某些类或结构,您能解释一下这个ToString()方法如何可用于Int32

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-24 04:16:06

如果结构不能继承某些类或结构,

这不是真的。所有结构(以及内置值类型,如System.Int32System.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结构类型

结构类型是可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型的值类型。

票数 34
EN

Stack Overflow用户

发布于 2012-05-24 04:17:23

Int32实现了定义ToString方法的IFormattable

票数 1
EN

Stack Overflow用户

发布于 2012-10-08 23:53:34

从ValueType派生的每个类型定义实际上在运行库中定义了两种不同的东西:堆对象类型(从ValueType派生,再从Object派生,并包含嵌入式类型信息)和存储位置类型(不包含任何嵌入式类型信息,但要求使用它的代码必须有其他方式知道它是什么)。堆对象类型的实例包含存储位置类型的字段,尝试访问this的代码将访问该字段。如果值类型被隐式或显式地转换为引用类型的存储位置,则系统将创建一个具有适当类型的新堆对象,并将该值类型的所有公共和私有字段复制到堆对象中的相应字段。如果堆对象被强制转换为值类型的存储位置,则堆对象中的所有公共和私有字段都将复制到值类型的存储位置。

如果试图在值类型的堆对象上使用任何Object或接口方法,则将像调用任何其他堆对象方法一样调用该方法。如果在值类型的存储位置上进行尝试,则对于GetType以外的任何方法,编译器将生成一个特殊的“受约束”操作码,该操作码通知运行时存储位置的类型,并指示运行时调用适合于该类型的方法的地址。由于编译器将具有可用的存储位置类型,并且运行时可以使用该类型来查找适当的方法,因此可以直接在存储位置上调用适当的方法,而不必首先创建新的堆对象。GetType是一个值得注意的例外;因为它是通过检查对象中嵌入的类型信息来工作的,所以它只能处理嵌入了类型信息的对象。因此,在调用之前,其参数将被转换为堆对象形式;然后,GetType将能够检查该堆对象的嵌入类型信息。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10727151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档