Equals在结构体上不起作用
本文关键字:不起作用 结构体 Equals | 更新日期: 2023-09-27 18:06:58
由于非常可怕的原因,我在我的雇主申请中使用了这个结构体。
我试图覆盖相等操作符,但我得到错误Error 9 Operator '==' cannot be applied to operands of type 'TR_St_DateTime' and 'TR_St_DateTime'
。
我错过了什么?
public struct TR_St_DateTime : IEquatable<TR_St_DateTime>
{
public int Year;
public int Month;
public int Day;
public int Hour;
public int Minute;
public int Second;
public TR_St_DateTime(DateTime time)
{
Day = time.Day;
Hour = time.Hour;
Minute = time.Minute;
Second = time.Second;
Month = time.Month;
Year = time.Year;
}
public override bool Equals(object obj)
{
TR_St_DateTime o = (TR_St_DateTime) obj;
return Equals(o);
}
public override int GetHashCode()
{
return Year ^ Month ^ Day ^ Hour ^ Minute ^ Second;
}
public override string ToString()
{
return String.Format("{0}/{1}/{2}", Day, Month, Year);
}
public bool Equals(TR_St_DateTime other)
{
return ((Day == other.Day) && (Month == other.Month) && (Year == other.Year) && (Minute == other.Minute) && (Hour == other.Hour) && (Second == other.Second));
}
}
更新:似乎==
不起作用,但Equals
起作用。
不需要在struct上实现Equals
您没有重载==
操作符,这就是编译器抱怨的原因。你只需要写:
public static bool operator ==(TR_St_DateTime left, TR_St_DateTime right)
{
return left.Equals(right);
}
public static bool operator !=(TR_St_DateTime left, TR_St_DateTime right)
{
return !(left == right);
}
我强烈建议您避免使用这些公共字段。如果你不小心,可变结构可能会导致许多意想不到的副作用。
(您还应该遵循。net命名约定,如果调用Equals(object)
方法时引用了不同类型的实例,则返回false
,而不是无条件强制转换。)
覆盖Equals
方法不会自动实现==
。您仍然需要手动重载这些操作符并将它们提供给Equals
方法
public static bool operator==(TR_St_DateTime left, TR_St_DateTime right) {
return left.Equals(right);
}
public static bool operator!=(TR_St_DateTime left, TR_St_DateTime right) {
return !left.Equals(right);
}