C#中Type对象==比较疑问:为何引用比较返回True?
关于C#中
typeof与GetType()返回值的==比较问题 你的理解确实存在一处关键偏差,直接给结论:这段代码的输出True是完全正确的,核心原因是**typeof(string)和s.GetType()返回的是同一个Type对象实例**,并非两个不同的对象。
具体拆解说明:
- 虽然
Type属于引用类型,但.NET的CLR(公共语言运行时)对每一种托管类型,都会在内存中维护唯一的一个Type实例,这是CLR类型系统的核心特性之一。 typeof(string)是编译时确定的操作,它直接从CLR的类型元数据中获取string类型对应的那个唯一Type实例。s.GetType()是运行时操作,它获取的是变量s实际指向对象的类型对应的Type实例——因为s是string类型的对象,所以拿到的还是同一个string类型的唯一Type实例。
所以当你用a1 == a2进行比较时,本质是对同一个引用进行比较,自然返回True。你甚至可以用object.ReferenceEquals(a1, a2)来验证,结果同样是True,足以证明两者指向的是同一个对象。
另外补充:Type类型还重写了Equals方法,即便极端场景下出现不同的Type实例(实际不会发生),Equals也会基于类型标识判断相等,但在这个场景里,连引用比较都直接成立了。
内容的提问来源于stack exchange,提问作者Deva Raja
相关产品推荐
相关产品推荐

