如果一个struct不能继承另一个类或struct,为什么Int32有一个ToString()方法?整数=2;Console.WriteLine(a.ToString());//在这里显示2//ToString()的定义-publicoverridestringToString();现在,这里是我的一些理解:所有在.net中的类都得到一个继承自Object类的ToString()方法。结构不能派生自类或其他结构。int是Int32类型的结构,它从它实现的接口中获取多个ToString()[WithParameters]方法。structInt32也有一个ToString()[withoutparams]函数根据http://msdn.microsoft.com/en-us/library/system.int32.tostring.aspx,structInt32覆盖ValueType.ToString()方法如果struct不能继承某个类或结构,所以请解释一下这个ToString()方法对Int32是如何工作的?如果一个结构不能继承一个类或结构,它就不会。所有结构(以及内置值类型,如System.Int32、System.Single等)始终隐式继承自System.ValueType(继承自System.Object)。但是,您不能创建从其他任何东西继承的结构。C#语言规范4.1.1中明确规定:4.1.1System.ValueType类型所有的值类型都隐式继承自System.ValueType类,System.ValueType继承自类对象。任何类型都不可能从值类型派生,因此值类型是隐式密封的(第10.1.1.2节)。然后,后面(4.1.3)struct被显式定义为值类型:4.1.3结构类型struct类型是值类型,可以声明常量、字段、方法、属性、索引器、运算符、实例构造函数、静态构造函数和嵌套类型。Int32实现了IFormattable,它定义了ToString方法每个从ValueType派生的类型的定义实际上在运行时定义了两个不同的东西:一个堆对象(它从Object派生出ValueType,并包含嵌入式类型信息)和一个存储位置(它不'不包含任何嵌入式类型信息,而是要求使用它的代码必须有一些其他方式知道它是什么。堆对象类型的实例包含存储位置类型的字段,并且试图访问该字段的代码将访问字段的存储位置。如果一个值类型被隐式或显式转换为引用类型存储位置,系统将创建一个新的具有适当类型的堆对象,并将该值类型的所有公共和私有字段复制到堆对象中对应的字段。如果将堆对象强制转换为值类型存储位置,则堆对象中的所有公共和私有字段将被复制到值类型存储位置。如果您尝试使用任何对象或接口方法,该方法将像任何其他堆对象方法一样被调用。如果尝试在值类型存储位置上,编译器将为除GetType之外的任何方法生成一个特殊的“约束”操作码,此操作码通知运行时存储位置的类型并指示运行时调用地址适合该类型的方法类型。由于编译器将拥有可用的存储位置类型,并且运行时可以使用它来找到合适的方法,因此它可以直接在存储位置调用合适的方法,而无需先创建新的堆对象。GetType是一个明显的例外;由于它通过检查对象中嵌入的类型信息来工作,因此它只能处理具有嵌入类型信息的事物。因此,它的参数将在调用之前转换为堆对象形式;然后GetType将能够检查该堆对象的嵌入类型信息。以上是C#学习教程:如果结构体不能继承另一个类或结构体,为什么Int32有ToString()方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
