Deutsch

C# operator ==

204  
Murr патриот22.06.18 16:59
Murr
22.06.18 16:59 

C# operator ==


как он пишется надеюсь все помнят - public static Boolean operator ==(TObject a, TObject b) { ... }


Но меня интересует не этот вариант а чутк другой:

public static Boolean operator ==(TFirst a, TSecond b) { ... }


Т.е. вариант, когда сравниваются разнотипные объекты.

Написать сам компаратор разнотипных объектов - проблемы не представляет.


Вопрос возникает позднее, кода в коде имеется


TFirst a = new TFirst();

TSecond b = new TSecond();

if(a == b) { ... } // ok

if(b == a) { ... } // error


Операция ==, в общем-то, коммутативная, от положения операндов зависеть не должна.


Но Шарп "не понимает" коммутативность и потому придется писать парную свапнутую

операцию.


Как решаете подобные вопросы?

Пишете в том же классе или переносите в первый в операторе==?


#1 
AlexNek патриот22.06.18 22:12
AlexNek
NEW 22.06.18 22:12 
в ответ Murr 22.06.18 16:59
Как решаете подобные вопросы?

не пользуем operator == спок В команде лучше таких вещей не делать

#2 
Murr патриот23.06.18 06:59
Murr
NEW 23.06.18 06:59 
в ответ AlexNek 22.06.18 22:12

Почему?

Инкапсуляция в данном случае не нарушается.

Результирующий код выглядит нормально.

Работает все тоже на раз.


Но есть описанная проблема. С нею надо разобраться и забыть - просто писать 6-ть методов, вместо 4-х. Вопрос лишь где именно это делать...

#3 
AlexNek патриот23.06.18 12:31
AlexNek
NEW 23.06.18 12:31 
в ответ Murr 23.06.18 06:59
Почему?

потому как ты привык что == делает то что видно сразу и нужно знать, что именно перекрыто, иначе можно не понять как енто работает. Да и побочные эффекты могут быть.

Я вот один раз в ToString что то намудрил, гонки получались и в отладчике неправильно показывало значение и в проге иногда.

Мне лично так бы больше подошло: bool Compare(this A a, B b), bool Compare(this B b, A a), хотя две не делал бы, потому как "сравнение" должно быть одно, придется третью функцию писать.

#4 
Murr патриот23.06.18 16:46
Murr
NEW 23.06.18 16:46 
в ответ AlexNek 23.06.18 12:31, Последний раз изменено 23.06.18 16:50 (Murr)

Ну а Я как раз не хочу писать a.Compare(b) в том месте, где мне удобно написать а==b.

Меня ведь итересует не больше-равны-меньше, а именно == или !=.


Проблемы написания и связанные с ними ошибки меня сейчас не интересуют.

Все, что меня беспокоит, это чтобы результирующий код был прост и понятен.


Но вопрос был не чем заменить, а в как и где доопределять комутативную пару.

#5 
AlexNek патриот23.06.18 18:19
AlexNek
NEW 23.06.18 18:19 
в ответ Murr 23.06.18 16:46
а в как и где доопределять комутативную пару.

В может еще и ключ от квартиры где деньги лежат (С) ОБ улыб

Одна функция сравнения и две обвертки спок


Что то перестала инфа о новых ответах приходить.

#6 
Murr патриот24.06.18 10:56
Murr
NEW 24.06.18 10:56 
в ответ AlexNek 23.06.18 18:19

Одна функция сравнения и две обвертки

------

Так куда обертки то класть?


Можно все в один из классов, но вроде как инкапсуляция в минусе.

Можно - по разным, но тогда еще проблемнее.


А вынести в чистый эхтентион - низзя вроде...


перестала инфа о новых ответах приходить.

------

У меня ее никогда и не было - местный сервер на местную почту ничего не отправляет.

#7 
AlexNek патриот24.06.18 12:58
AlexNek