【发布时间】:2016-08-19 01:48:57
【问题描述】:
我有以下课程:
public class CalculateToValue
{
public CalculateToValue(string normalValue)
{
NormalValue = normalValue;
}
public string NormalValue { get; private set; }
public bool Equals(string other)
{
return NormalValue.Equals(other);
}
public bool Equals(CalculateToMax other)
{
return NormalValue.Equals(Enum.GetName(typeof(CalculateToMax),
other));
}
public static bool operator ==(CalculateToValue a, CalculateToMax b)
{
if (((object) a == null) || ((object) b == null))
{
return false;
}
return a.Equals(b);
}
public static bool operator !=(CalculateToValue a, CalculateToMax b)
{
return !(a == b);
}
}
一切正常。但它在课堂上显示了一个更清晰的警告。它说-
计算值定义运算符== 或运算符!=,但不会覆盖Object.Equals(object o) 和Object.GetHashcode()
如果我通过 resharper 生成代码,警告会得到修复。
protected bool Equals(CalculateToValue other)
{
return string.Equals(NormalValue, other.NormalValue);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((CalculateToValue) obj);
}
现在由于这个类是一个遗留类,我不确定上面的 resharper 生成的代码是否正常。
谁能解释一下为什么我会收到这个警告?
【问题讨论】:
-
这个想法是,如果您定义
==运算符,您可能还希望覆盖这些方法,以指示您希望根据值而不是引用对该类的对象进行排序和比较。但是,您已经定义了具有不同类型的运算符,这本身就很奇怪。实际上,您似乎应该定义显式或隐式转换。
标签: c# resharper overloading