代码契约警告DateTime.HasValue总是计算为一个常量值

本文关键字:一个 常量 计算 警告 契约 DateTime HasValue 代码 | 更新日期: 2023-09-27 18:17:16

我有一个问题,可能是代码合同中的错误,或者我只是错过了一些东西。

我有一个可空的DateTime属性DateValue的类,它由构造函数设置。类的==重载声明如果first.DateValue == second.DateValue,两个对象是相等的。奇怪的是,这种比较会导致代码契约警告:

布尔条件first. datevaluate . hasvalue的计算结果总是a常数值。如果它(或它的否定)出现在源代码中,您就可以可能有一些死代码或冗余检查

// 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());
    }
}

代码契约警告DateTime.HasValue总是计算为一个常量值

根据我的经验,这是Code Contracts中的一个bug。我在其他情况下也遇到过。看看这个问题(和答案),它在本质上与你的问题相似:CodeContracts:布尔条件计算为一个常量值,为什么?