operator == in base,Equals in derived

时间:2017-01-17 07:55:34

标签: c# .net operator-overloading equality

我有一个通过引用进行比较的基类,以及一个按值进行比较的派生类(仅显示相关的行):

class Term : IReadOnlyList<Term>
    public static bool operator ==(Term a, Term b)
    {
        if (ReferenceEquals(a, null))
            return false;
        return a.Equals(b);
    }

sealed class CompoundTerm : Term, IReadOnlyList<Term>
    public override bool Equals(object o)

因此派生类会覆盖Equals,但基类必须重载==,因为a == b可能会a出现b并且Term被声明为CompoundTerm,但实际上指向Term.cs(40,11): warning CS0660: 'Term' defines operator == or operator != but does not override Object.Equals(object o)

据我所知 - 如果我错了,请纠正我 - 这一切都是必要和正确的。

遗憾的是编译器不满意:

For example my App is like
import React from 'react';
import Header from './Header.jsx';
class App extends React.Component {
constructor(props) {
  super();
  this.state = {
                show : '1',
            }
   this.showHide = this.showHide.bind(this);
}

showHideSearch() {
    this.setState(prevState => ({
      show: prevState.show == '1' ? '0' : '1',
    }));
}
render() {
return (
    <div>
        <Header show={this.state.show}/>
        {this.props.children}
    </div>
)
}  
}

export default App;

import React from 'react';
import Dashboard from './Dashboard.jsx'
class Home extends React.Component {
constructor(props) {
  super();
  this.showHide = this.showHide.bind(this);
}
showHide() {
      tried this but not working
    //this.props.showHideSearch();
}
render() {
return (
    <div>// this props show not going to dashboard component
        <Dashboard show={this.props.show} showHide=  {this.showHide.bind(this)}/>
    </div>
)
}
}

export default Home;

这里最好的事情是什么?我可以使用禁用警告的蛮力解决方案,但我想检查并确保没有更优雅的解决方案,有些成语我不知道。

1 个答案:

答案 0 :(得分:0)

  

我有一个通过引用和派生类进行比较的基类   通过值进行比较(仅显示相关的行   这里)

您当前的实施并不一定执行参考相等;它通常会调用Equals的潜在重载。

  

因此派生类会重写Equals,但基类必须重载== ...

我不明白为什么,如果基类覆盖Equals,则需要在基类中重载==。如果没有定义重载,==已经执行了引用比较,因为在编译时解析了静态== (object, object)

  

...... a == b可能会出现在a和b被声明为Term但实际上指向CompoundTerm的上下文中。

调用a运算符时,b==的实际类型无关紧要。 ==是一个静态方法,因此将根据参数的引用类型进行解析:

object aString = "Hello";
object theSameString = new string(new[] { 'H', 'e', 'l', 'l', 'o' }); //to avoid string interning
var referenceEquals = aString == theSameString; //false: object == object
var valueEquals = (string)aString == (string)theSameString; //true: string == string

现在,我理解你正在尝试的是,如果==ab而不是子类,则在调用Term时执行引用相等,否则可能会执行潜力价值平等。

老实说,这似乎相当混乱。我建议==始终执行引用相等(不要重载它),如果需要潜在的值相等,请使用Equals并记录类或代码以使此行为清晰。