CodeContracts Invariant是错误的

时间:2013-02-13 11:32:10

标签: c# .net code-contracts

VS2010一直告诉我CodeContract.Invariant是假的。我看不出这是怎么回事

public class BankAccountIdentifierDefinitionVariation_CreateCommandArgs : ValidatedCommandArgs
{
    public string IdentifierCode {get; private set; }
    public string CountryCode {get; private set; }
    public Ems.Infrastructure.Validation.StringValidator Validator {get; private set; }

    private BankAccountIdentifierDefinitionVariation_CreateCommandArgs()
        : base() { }

    public BankAccountIdentifierDefinitionVariation_CreateCommandArgs(
        string identifierCode,
        string countryCode,
        Ems.Infrastructure.Validation.StringValidator validator)
    {
        Contract.Requires(!string.IsNullOrEmpty(identifierCode));
        Contract.Requires(!string.IsNullOrEmpty(countryCode));
        Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode));
        Contract.Ensures(!string.IsNullOrEmpty(this.CountryCode));

        this.IdentifierCode = identifierCode;
        this.CountryCode = countryCode;
    }

    [ContractInvariantMethod]
    void ContractInvariants()
    {
        Contract.Invariant(!string.IsNullOrEmpty(IdentifierCode));
        Contract.Invariant(!string.IsNullOrEmpty(CountryCode));
    }
}

警告是两个不变量都是假的,显然不是这种情况。我也尝试了以下两种变体。

Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode);
if (string.IsNullOrEmpty(identifierCode)) throw new ArgumentNullException...
this.IdentifierCode = identifierCode;

以及

Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode));
this.IdentifierCode = identifierCode;
if (string.IsNullOrEmpty(this.IdentifierCode)) throw new ArgumentNullException...

看起来好像是不对的,因为我可以通过私有的setter来改变属性的值(即使我没有。)有没有办法处理这个问题?属性必须保留属性,因为我正在序列化。

2 个答案:

答案 0 :(得分:2)

似乎静态分析器未能看到永远不会调用无参数构造函数。也许它的存在足以质疑你的不变量。

你可以完全删除它吗?如果你已经有一个构造函数,为什么还需要一个私有的无参数构造函数?

答案 1 :(得分:0)

我希望私有默认构造函数成为警告的来源,因为执行它确实会违反不变量。但是,由于您定义了构造函数,因此无法阻止您删除默认构造函数。如果您定义至少一个构造函数,编译器将不会代表您发出默认构造函数,并且由于您从未使用默认构造函数,因此没有理由将其置于首位