重载==操作符
本文关键字:操作符 重载 | 更新日期: 2023-09-27 17:55:04
A
直接派生自Object
类,A
和Object
都没有重载==
运算符,那么为什么下一个代码不会导致错误:
class Program
{
static void Main(string[] args)
{
A a1 = new A();
A a2 = new A();
if (a1 == a2) ... ;
}
}
class A { }
谢谢
A直接派生自Object类,既不是A也不是Object重载==操作符,那么为什么下一个代码不会导致错误呢?
关于你的另一个问题,你似乎有一种奇怪的信念,认为是否存在重载操作符与是否可以有意义地选择操作符有任何关系。不。
同样,要解决这种情况,重载解析首先尝试确定是否在任意一个操作数上定义了用户定义的操作符。如你所见,没有。
然后,重载解析依赖于内置操作符。正如我在你的另一个问题中提到的,内置操作符是int、uint、long、ulong、bool、char、float、double、decimal、object、string、所有委托类型和所有枚举类型的相等操作符,以及所有值类型的提升为可空版本。
给定这些操作符,现在必须确定适用的操作符。没有从"A"到任何值类型、到任何可空值类型、到字符串或到任何委托类型的隐式转换。
唯一可用的候选对象是object。
如果重载解析选择比较两个对象的相等操作符,则必须满足附加约束。特别是,两个操作数必须要么为空,要么为引用类型,要么为不被约束为值类型的类型参数。这个约束条件是满足的。此外,如果操作数的两端都有类型,那么操作数类型必须具有某种兼容性关系;你不能做"myString == myException",因为string和Exception之间没有关系。" a "answers" a "之间有一种关系,即它们是相同的。
因此选择引用相等操作符,==表示"通过引用比较这两个对象表达式"。
我很困惑,为什么你认为有一个用户定义的==操作符与此有任何关系,无论是在这个问题或你的其他问题。没有这样的方法并不妨碍编译器为这个表达式生成它喜欢的任何代码。你能解释一下吗?
因为默认情况下,==操作符比较对象a1
和a2
的引用(内存位置)。因为它们是A
类的不同实例,表达式a1 == a2
在你的例子中总是求值为false。
对象具有==
操作符的默认实现,该操作符检查它们是否引用同一对象(引用比较)。所以它没有理由是错误的。
因为Object
有比较引用的默认实现
基数的==
运算符被称为为什么它没有给出任何错误
默认情况下,操作符==测试通过确定if来引用相等性两个参考文献表明相同对象,因此引用类型不需要实现运算符==以便获得此功能
从http://msdn.microsoft.com/en-us/library/ms173147 (v = vs.80) . aspx
关于你的问题,重要的一点是:
引用类型则不需要实现operator ==以获得这个功能