2013-04-02 2 views
2

По крайне жутким причинам у меня есть эта структура в приложении для моих работодателей.Равны не работают на structs?

Я попытался переопределить оператор равенства, но получаю ошибку 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)); 
    } 
} 

UPDATE: кажется, что == не работает, но Equals делает.

Нет необходимости в реализации Equals на structs.

+1

Какая ошибка? –

+0

Ошибка Оператор '==' не может быть применен к операндам типа «TR_St_DateTime» и «TR_St_DateTime» – Nahum

+0

Оператор == - это не то же самое, что метод Equals, и действительно часто дает другой результат. – harold

ответ

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 именования, и вернуть false если метод Equals(object) вызываются со ссылкой на экземпляр другого типа, а не безоговорочно литья.)

+0

Джон, ты МАСТЕР. – Nahum

+0

@NahumLitvin - За исключением «Мастер» сумасшедший, и Джон не сумасшедший. ** Да, я сделал ссылку «Доктор Кто» ** –

+0

Я узнаю что-то каждый раз, когда я читаю один из ваших ответов. На протяжении более десяти лет я всегда делал такие вещи, как реализация интерфейсов равенства или переопределение «Equals», но я считаю, что теперь буду строить свои собственные '==' и '! =' Операторы! ** Один вопрос, ** действительно ли это более результативно, чем говорят интерфейсы равенства и т. Д. –

3

приоритету метод Equals Безразлично» t автоматически реализует ==. Вам все еще нужно вручную перегружать этих операторов и подавать их на метод 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); 
} 
+0

Джон отправил вас на несколько секунд :) – Nahum

+1

@NahumLitvin, если вы посмотрите на отметки времени, я избил его :) – JaredPar

Смежные вопросы