2

由于极其可怕的原因,我的雇主申请中有这个结构。

我试图覆盖相等运算符,但出现错误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确实如此。

无需Equals在结构上实现。

4

2 回答 2

10

您没有重载==运算符,这就是编译器抱怨的原因。你只需要写:

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 命名约定,并在调用falseEquals(object)方法时返回对不同类型实例的引用,而不是无条件强制转换。)

于 2013-04-02T15:17:12.473 回答
3

覆盖该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);
}
于 2013-04-02T15:17:29.530 回答