代码合同警告 DateTime.HasValue 始终计算为常量值
Code contracts warning DateTime.HasValue always evaluates to a constant value
我有一个问题,可能是代码合同中的错误,或者我只是遗漏了一些东西。
我有一个 class 和一个可以为 null 的 DateTime 属性 DateValue
,它由构造函数设置。 class 的 == 重载声明如果 first.DateValue == second.DateValue
则 2 个对象相等。奇怪的是,这种比较导致代码契约警告:
The Boolean condition first.DateValue.HasValue always evaluates to a
constant value. If it (or its negation) appear in the source code, you
may have some dead code or redundant check
// 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);
}
// ...
}
我不明白为什么重写者会认为 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());
}
}
根据我的经验,这是代码合同中的错误。我在其他情况下也遇到过。看看这个问题(和答案),它在本质上与您的问题相似:
我有一个问题,可能是代码合同中的错误,或者我只是遗漏了一些东西。
我有一个 class 和一个可以为 null 的 DateTime 属性 DateValue
,它由构造函数设置。 class 的 == 重载声明如果 first.DateValue == second.DateValue
则 2 个对象相等。奇怪的是,这种比较导致代码契约警告:
The Boolean condition first.DateValue.HasValue always evaluates to a constant value. If it (or its negation) appear in the source code, you may have some dead code or redundant check
// 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);
}
// ...
}
我不明白为什么重写者会认为 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());
}
}
根据我的经验,这是代码合同中的错误。我在其他情况下也遇到过。看看这个问题(和答案),它在本质上与您的问题相似: