C# 既然Int32是一种值类型,为什么它要继承.ToString()?
关于提示此问题的C# 既然Int32是一种值类型,为什么它要继承.ToString()?,c#,.net,tostring,value-type,reference-type,C#,.net,Tostring,Value Type,Reference Type,关于提示此问题的.ToString()。他们说: 因为对象是.NET中所有引用类型的基类 框架中,此行为[.ToString()]由不包含该行为的引用类型继承 重写ToString方法 此外,它还提到: 例如,Char、Int32和String等基本类型提供了ToString实现 但是,Int32是一个结构,因此必须是值类型 这是怎么回事?Int32是否实现了它自己的.ToString(),它与对象无关?是的,Int32覆盖了ToString。。。虽然这在这里有点无关紧要。所有类型都继承obje
.ToString()
。他们说:
因为对象是.NET中所有引用类型的基类
框架中,此行为[.ToString()]由不包含该行为的引用类型继承
重写ToString方法
此外,它还提到:
例如,Char、Int32和String等基本类型提供了ToString实现
但是,Int32是一个结构,因此必须是值类型
这是怎么回事?Int32是否实现了它自己的.ToString(),它与对象无关?是的,
Int32
覆盖了ToString
。。。虽然这在这里有点无关紧要。所有类型都继承object
的成员-您可以随时调用ToString()
,也可以随时调用Equals
等(ValueType
为您重写Equals
和GetHashCode
,不过您几乎应该总是在结构中进一步重写它们,以提供更高效的实现。)
请注意,您可以非常轻松地重写这些方法:
public struct Foo
{
public override string ToString()
{
return "some dummy text";
}
}
不清楚哪个方面让你困惑(这里涉及到很多不同的领域)。如果您能澄清,我们可以解决具体问题。Int32是一种结构,因此是一种值类型。 但是:
Int32派生自System.ValueType,而它本身派生自System.Object。瞧…文件错了。引用和值类型都从对象继承该行为(但请记住这一点)
所有(大多数?)核心值类型都重写ToString(),以返回比类名更合理的内容。我认为对您的问题的简短回答是,值类型继承自对象,而值类型又继承自对象。每个
struct
都继承自System.ValueType
类(不允许)这完全是由编译器完成的。所有struct
都有ValueType
基类中的方法,基类继承自Object
类,使我们可以访问ToString()
和所有其他类
尽管
值类型
继承自对象
类,但它具有重写的特殊实现。可能是因为您没有意识到值类型继承自对象
?这是System.Object
、System.ValueType
、System.Int32
和MyNamespace.Customer
的继承图,它们应该是您自己创建的类。我很懒,没有编写Int32
的所有公共方法和接口
ToString
在Object
中声明,但在ValueType
和Int32
中都被重写,我很确定它与装箱有关。@MBen我很确定问题和答案与装箱无关。听起来你可能对值类型如何从引用类型,这有点像是对如何将红色框放在蓝色框中感到困惑——当然,您只能将蓝色框放在其他蓝色框中,对吗?不,您可以将红色框放在蓝色框中,也可以从引用类型派生值类型。这可能会有所帮助:请注意,您引用的文档中说“Object
是.NET Framework中所有引用类型的基类”。但是,这并不意味着继承层次结构中包含Object
的所有对象都是引用类型。(所有猫都属于哺乳类,但并非哺乳类中的所有物种都属于猫。)值类型从引用类型继承是完全合法的,事实上,所有struct
都源自ValueType
(本身就是引用类型)`而ValueType
源自Object
。我猜他对这样一个事实感到困惑,即值类型的行为类似于值类型,但继承自Object,后者是一个类,因此是一个引用类型。@AndreasNiedermair:除此之外,它们继承自ValueType
,后者本身就是一个类:)jup,知道吗,我只是想说得很清楚:)谢谢Jon-是你关于值+引用类型的文章让我开始思考这个问题。混淆之处在于语句对象是所有引用类型的基类
,因此继承了。ToString
那么为什么Int32也继承了它呢?作为所有引用类型的基类并不意味着它也不能在所有值类型的继承层次结构中公共结构Foo:System.Object
。。。?我想知道他们是如何编译的:)如果你反编译System.Int32
,你会得到公共结构Int32:IComparable,IFormattable,IConvertible,IComparable,IEquatable
。。。但是仍然有一个baseType系统。ValueType
。。。奇怪,不是吗?很好,这帮助我理解了-那么,System.ValueType
是否有什么特别之处,使运行时能够以不同的方式处理它?我认为如果@Jon能够详细说明这一点,它会很方便@安德烈亚斯尼德米尔:你想知道的具体是什么?我向你保证,它没有什么神奇之处;这是一个直截了当的编译器。@Andreas Niedermir:根据规范,这是不合法的。该规范明确指出,您不能显式地从System.ValueType
派生,并且有一个特殊的保留字struct
来实现这一点,当您使用它来标记类型定义时,您只能列出该类型实现的接口,而不能列出基类(同样,它隐式派生自System.ValueType
)。上面引用的文档是正确的。为什么您认为它不正确?@ERic Lippert:如果值类型为
System.Object
System.ValueType
System.Int32