![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
Partizan, есть предположение, что для D1 метод CanCompareBits возвращает false по причине наличия поля типа int и сравнение ведется не побитиво, а по полям. А в D2 выполняется FastEqualsCheck, который возвращает false.
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
ммм...странно..очень странно...каким образом поле типа int может повлиять на возможность побитового сравнения?
-------------------- СУВ, Partizan. |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
Копание в инете дало варианта - CanCompareBits не проходит если в структуре есть пропуски, которые забиваются случайными данными. Возможно то как раз тот случай.
|
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
||||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
мде...вот и ответ на вопрос...
Magic???? - Magic! -------------------- СУВ, Partizan. |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 4 Всего: 26 |
Если я все правельно понял , то получается следующее :
1. В памяти +0 и -0 хранятся по разному , для вещественных типов 2. Разработчики BCL определили Equals для вещественных чисел таким образом , что +0 -0 равные числа. Обоснование этого - для человека это действительно одинаковые числа. В общем то так оно и должно быть. 3. Для типов значений метод Equals без переопределения исходя из каких то своих соображений то выдает результат на основе побитового сравнения обьектов , то сравнивая поля класса. 4. Из-за переопределённого на уровне double Equals метода мы получаем разные результаты при разных способах сравнения обьектов. Просто разработчики BCL видемо забыли такой вариант рассмотреть. Не знаю , по идее надо куда то писать в M$ с просьбой профиксить. Интересно все таки на основе чего выбирается метода сравнения валуе типов..... Кто нибудь проверял это в CLR 1.x. вдруг там подругому.... Это сообщение отредактировал(а) nikitao - 7.10.2008, 19:53 -------------------- Жизнь - печальная штука. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Проверяли в жабе...в обоих случаях она выдаёт false
-------------------- СУВ, Partizan. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
А ты добавь в структуру D2 поле типа int, можешь даже не делать с ним ничего, и посмотри результат.
-------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| HalkaR |
|
|||
![]() Пуфыстый назгул ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2132 Регистрация: 8.12.2002 Где: В Москве Репутация: 14 Всего: 42 |
diadiavova, собственно в результате никто не сомневается
|
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
Прикольный баг. Надо всё-таки самим определять Equals, а не надеятся на компилятор.
Извиняюсь, а как такое можно проверить в Java, если там в принципе нет никаких value type? -------------------- Да. Именно так. |
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
Дрон, =) Не знал, не спец по жабе) я ж говорю, разведка доложила)
-------------------- СУВ, Partizan. |
|||
|
||||
| diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 31 Всего: 142 |
Честно говоря всю тему поленился читать, каюсь. Выскажу предположение, надеюсь меня за это не побьют. Когда в структуре числовые поля одного типа, их сравнение ведётся по упрощённому алгоритму, просто сравниваются как double и всё. А если поля разнотипные, то сначала проверяется тип, причём проверка осуществляется по значению. При проверке чисел 0 и -0 они(по значению) типизируются как целочисленные и логика перенаправляется в ту ветвь, где сравниваются целые числа. А при сравнении их как целых результат очевиден. Так что, возможно это не ошибка, а просто ради экономии ресурсов упростили. -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит |
|||
|
||||
| source777 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1878 Регистрация: 12.3.2007 Репутация: 4 Всего: 56 |
здравая мысль.
Впрочем это как раз будет следованием .NET Guidelines.. Все сравниваемые пользовательские типы должны иметь собственную реализацию IEquatable<T>. -------------------- Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |