2014-11-11 5 views
3

Метод EqualsImpl в классе Nodatime BclDateTimeZone выбрасывает NotImplementedException. Документировано вести себя таким образом - есть ли причина для этого?Nodatime BclDateTimeZone EqualsImpl throws NotImplementedException

При проверке равенства двух ZonedDateTime с использованием BclDateTimeZone это вызывает исключение исключения.

Является ли это ошибкой, это не кажется правильным?

+0

Бросок «NotImplementedException» определенно не является _bug_, особенно если он задокументирован. –

+0

Не задокументировано, что мой 'ZonedDateTime' может генерировать исключение при проверке равенства. –

ответ

2

Документировано вести себя таким образом - есть ли причина для этого?

Yup - это в основном очень сложно определить равенство зоны в общем виде. Предположим, у нас есть два BclDateTimeZone экземпляры, какие компресс два различных TimeZoneInfo значения ... мы могли бы:

  • говорят, что они не равны произвольно, даже если они логически эквивалентны
  • Сравните их ID (невозможно ЗКС, который не поддерживает идентификаторы, и ломались под Mono, почему TimeZoneInfo.Local имеет идентификатор Local IIRC)
  • Сравните их равенства на протяжении всей истории, что является очень дорогостоящим

Я согласен с тем, что это боль, и я думаю, что я планирую удалить равенство ценности на ZonedDateTime целиком в Noda Time 2.0 и сделать ZonedDateTime ссылкой на равенство.

Если вы хотите, чтобы сравнить часовые пояса, лучшей альтернативой, вероятно, будет использование ZonedEqualityComparer, чтобы указать, как вы хотите, чтобы их сравнивали.

Но неспособность сравнивать значения равенства при использовании значений BCL определенно противна. У меня raised a bug; Я готовлю выпуск 1.3.1, и я могу проверить, могу ли я исправить его там, вместо того, чтобы ждать 2.0.

+0

Также подумайте, что если вы сравниваете по ID, у вас также есть возможность «TimeZoneInfo.FindSystemTimeZoneById (TimeZoneInfo.Local.Id)! = TimeZoneInfo.Local», потому что DST может быть отключен на панели управления Windows. (Soooo расстраивает!) –

+0

@MattJohnson: Ничего себе, совершенно забыл об этой возможности. Спасибо, что вызвали это. Я не уверен, как это можно устранить с помощью обратной совместимости, если честно ... Сравнение ссылок TimeZoneInfo может быть наименее худшим вариантом для 1.3.1 ... –

+0

Не уверен, что это когда-нибудь будет работайте для «Local». [См. Комментарии здесь] (http://referencesource.microsoft.com/#mscorlib/system/timezoneinfo.cs,151) –

0

После попытки ввода неудачных модульных тестов, чтобы доказать эту ошибку, мне было трудно воспроизвести.

Сравнение ZonedDateTime s с BclDateTimeZone s на разных смещениях не является проблемой. Сравнение ZonedDateTime s с различными LocalDateTime s не является проблемой.

Я мог видеть из источника, что сравнение ZonedDateTimeZone только входило в игру, если LocalDateTime и Offset были равны.

Моя проблема возникла, когда я использовал две разные ссылки BclDateTimeZone на том же самом расстоянии. Я сделал это, используя DateTimeZoneProviders.Bcl.GetSystemDefault() в одном месте и BclDateTimeZone.ForSystemDefault() в другом. Излишне говорить, что теперь они вызывают общий код.

Я это провал тест, где я сравниваю два ZonedDateTime сек с различными DateTimeZone с на то же смещение:

ZonedDateTime dtzOne = new ZonedDateTime(Instant.FromUtc(2014, 11, 11, 21, 00), DateTimeZoneProviders.Bcl.GetZoneOrNull("Greenwich Standard Time")); 
ZonedDateTime dtzTwo = new ZonedDateTime(Instant.FromUtc(2014, 11, 11, 21, 00), DateTimeZoneProviders.Bcl.GetZoneOrNull("GMT Standard Time")); 

Assert.That(dtzOne, Is.Not.EqualTo(dtzTwo)); 

Этот тест генерирует исключение здесь:

System.NotImplementedException : The method or operation is not implemented. 
    at NodaTime.TimeZones.BclDateTimeZone.EqualsImpl(DateTimeZone zone) 
    at NodaTime.DateTimeZone.Equals(DateTimeZone obj) 
    at NodaTime.ZonedDateTime.Equals(ZonedDateTime other) 

я могу легко работать вокруг этой проблемы, но это, вероятно, стоит исправить.

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