c# - 为什么多态性不能通过对象类型对运算符起作用?
问题描述
此处概述了代码演示:https ://dotnetfiddle.net/mCm8Hx
如果我有一个覆盖Equals
和运算符的==
类!=
,我可以通过键入为该类的变量来比较它们。
但是,如果我将它们转换为object
(或使用类型为分配给该类实例的对象的变量),则该运算符似乎不再被使用。
例如,这会起作用:
var a1 = new MyClass(5);
var a2 = new MyClass(5);
Console.WriteLine(a1 == a2); // prints "true" because I've implemented == operator
这也有效(MySubClass : MyClass
):
var b1 = new MySubClass(10);
var b2 = new MySubClass(10);
Console.WriteLine(b1 == b2); // prints "true" because I've implemented == operator in inherited class MyClass
但这不会:
object o1 = a1;
object o2 = a2;
Console.WriteLine(o1 == o2); //prints "false", doesn't use my operator implementation
由于所有类都隐式继承自Object
,因此我希望它的工作方式与MySubClass
. object
为什么类型化变量不是这种情况?
解决方案
首先让我们看一下 Object 类本身:
如您所见,Equals 方法上有virtual
键,这意味着在任何从对象继承的类中,如果您override
使用该方法,那么即使您的变量object o2 = a2;
是指向A
类的新实例的 typeof 对象 -> 此方法将由运行:
public override bool Equals(object other)
另一方面operator ==
is not virtual
,它不能被覆盖,所以当引用object
变量时,它总是会解析为System.Object.ReferenceEquals
推荐阅读
- javascript - 是否有“YYYY-MM-DD”的格式预设
- postgresql - 在 Postgres 中执行访问路径选择的源代码在哪里?
- functional-programming - 为什么 Elixir 的 Enum.count 不返回数字?
- reactjs - 上下文 API 从任何地方消费
- java - 通过 Java 服务器页面/Java 单击时动态创建带有“按钮”的文件夹
- ios - 如何从 UITableView 单元格获取数据到全局变量
- python - JSON,列表可能为空 - 什么类型?
- c# - 方法的类型参数……不能从用法中推断出来。尝试明确指定类型参数
- node.js - 未处理的拒绝 SequelizeEagerLoadingError:未关联,并且无法读取未定义的属性“getTableName”
- javascript - 如何使大型 if/else 语句更严格?