c# – 重载==运算符
A直接从Object类派生,既不是A或Object的重载==运算符,那么为什么下一个代码不会导致错误:
class Program { static void Main(string[] args) { A a1 = new A(); A a2 = new A(); if (a1 == a2) ... ; } } class A { } 感谢名单 解决方法
与您的其他问题一样,您似乎有一些奇怪的信念,即是否存在重载运算符与是否可以有意义地选择运算符有关.它不是. 同样,为了解决这种情况,重载决策首先尝试确定是否在任一操作数上定义了用户定义的运算符.如你所知,没有. 然后,重载分辨率会回退到内置运算符.正如我在你的另一个问题中提到的,内置运算符是int,uint,long,ulong,bool,char,float,double,decimal,object,string,所有委托类型和所有枚举类型的相等运算符,加上所有值类型的提升到可空的版本. 鉴于这些操作符我们现在必须确定适用的操作符.没有从“A”到任何值类型,任何可空值类型,字符串或任何委托类型的隐式转换. 唯一剩下的适用候选人是对象. 如果重载决策选择了比较两个对象的相等运算符,则必须满足其他约束.特别是,两个操作数必须为null或引用类型,或者不限制为值类型的类型参数.满足了这种约束.另外,如果双方都有类型,那么操作数类型必须具有某种兼容关系;你不能做“myString == myException”因为string和Exception之间没有关系. “A”和“A”之间存在关系,即它们是相同的. 因此,选择引用相等运算符,==表示“通过引用比较这两个对象表达式”. 我很困惑,为什么你认为有一个用户定义的==运算符与此有关,无论是在这个问题还是你的其他问题.缺少这样的方法并不妨碍编译器为此表达式生成它喜欢的任何代码.你可以解释吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |