我有一个通过引用进行比较的基类,以及一个按值进行比较的派生类(仅显示相关的行):
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;
这里最好的事情是什么?我可以使用禁用警告的蛮力解决方案,但我想检查并确保没有更优雅的解决方案,有些成语我不知道。
答案 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
现在,我理解你正在尝试的是,如果==
和a
是b
而不是子类,则在调用Term
时执行引用相等,否则可能会执行潜力价值平等。
老实说,这似乎相当混乱。我建议==
始终执行引用相等(不要重载它),如果需要潜在的值相等,请使用Equals
并记录类或代码以使此行为清晰。