VS2010 ne cesse de me dire qu'un CodeContract.Invariant est faux. Je ne vois pas comment cela peut être le casCodeContracts Invariant is false
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));
}
}
L'avertissement est que les deux sont faux invariants, qui ne peut évidemment pas être le cas. J'ai également essayé les deux variantes suivantes.
Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode);
if (string.IsNullOrEmpty(identifierCode)) throw new ArgumentNullException...
this.IdentifierCode = identifierCode;
et aussi
Contract.Ensures(!string.IsNullOrEmpty(this.IdentifierCode));
this.IdentifierCode = identifierCode;
if (string.IsNullOrEmpty(this.IdentifierCode)) throw new ArgumentNullException...
Il semble que l'invariant est faux, car il est possible pour moi de changer la valeur de la propriété via son setter privé (même si je ne le fais pas.) Est-ce il y a un moyen de faire face à cela? Les propriétés doivent rester propriétés car je suis sérialisation.
Que faire si l'objet est construit 'par son 'private 'constructeur sans arguments? –
Eh bien, ce n'est pas le cas. L'analyseur statique a la capacité de voir qu'aucune partie de la classe n'invoque le constructeur sans paramètre (et n'a pas à chercher dans les autres classes sauf celle-ci). – Alex
Alors, pourquoi cela existe-t-il? –