代码合同警告 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());
    }
}

根据我的经验,这是代码合同中的错误。我在其他情况下也遇到过。看看这个问题(和答案),它在本质上与您的问题相似: