У меня проблема, которая может быть ошибкой в контрактах с кодом или я просто что-то пропустил.Предупреждение о заключении контрактов по дате DateTime.HasValue всегда принимает значение
У меня есть класс с нулевым значением DateTime DateValue
, который устанавливается конструктором. Перегрузка класса == утверждает, что 2 объекта равны, если first.DateValue == second.DateValue
. Как ни странно, это сравнение вызывает предупреждение Код контракта:
Логическое условие first.DateValue.HasValue всегда оценивает в постоянное значение. Если он (или его отрицание) появляются в исходном коде, вы может иметь некоторый мертвый код или избыточные проверки
// relevant code only. full code posted later
public class ClassWithDate
{
public DateTime? DateValue { get; private set; }
public ClassWithDate(DateTime? dateValue)
{
DateValue = dateValue;
}
public static bool operator ==(ClassWithDate first, ClassWithDate second)
{
// ...
// !! CODE CONTRACT WARNING HERE !!
return (first.DateValue == second.DateValue);
}
// ...
}
Я не понимаю, почему ReWriter будет думать, что DateValue.HasValue
всегда является постоянной величиной, а также то, что он имеет отношение к равенству DateTime.
Я пропустил что-то с кодовыми контрактами? Или с перегрузками равенства? Может ли это быть ошибкой в кодовых контрактах?
Полный код ниже.
public class ClassWithDate
{
public DateTime? DateValue { get; private set; }
public ClassWithDate(DateTime? dateValue)
{
DateValue = dateValue;
}
public override bool Equals(object obj)
{
return ((obj as ClassWithDate) != null) && (this == (ClassWithDate)obj);
}
public static bool operator ==(ClassWithDate first, ClassWithDate second)
{
if (object.ReferenceEquals(first, second)) return true;
if (((object)first == null) || ((object)second == null)) return false;
// compare dates
return (first.DateValue == second.DateValue);
}
public static bool operator !=(ClassWithDate first, ClassWithDate second)
{
return !(first == second);
}
public override int GetHashCode()
{
return (DateValue == null ? 0 : DateValue.GetHashCode());
}
}
DateTime - это не объект, а тип объекта. – Hogan
Huh. Честно говоря, это головоломка для меня. Мне будет интересно увидеть решение. – BHustus
Если это тип значения, значение всегда будет истинным. Я не выглядел так тяжело в исходном источнике, но нулевое datetime не имеет смысла. Вероятно, просто установите значение равным нулю ... Это по-прежнему является юридическим значением для даты и времени, поэтому предупреждение действительно. – Hogan