>假设我有以下代码:
public abstract class TemplateBase {
public void TemplateMethod() {
Operation(); }
protected abstract void Operation(); }
public sealed class Implementation : TemplateBase {
bool _alwaysTrue;
public Implementation(bool alwaysTrue) {
_alwaysTrue = alwaysTrue; }
[ContractInvariantMethod] void ObjectInvariant() {
Contract.Invariant(_alwaysTrue == true); }
protected override void Operation() {
_alwaysTrue = false; } }
[TestClass] public sealed class InvariantTest {
[TestMethod] public void Constructor() {
new Implementation(false); }
[TestMethod] public void Method() {
new Implementation(true).TemplateMethod(); } }
InvariantTest.Constructor 总是失败,并出现"Invariantfailed"异常。
如何使不变量测试方法基于不变量失败?
我已将运行时检查设置为完整,甚至启用了"呼叫站点需要检查",但即使这样也无济于事。
如果您使用最新版本 (1.4.50910.0),您将从静态检查器收到一条警告,指出不变性为 false。
但对于运行时,这是预期行为。从手册:
出于在运行时检查期间,不变量是 在每个公共方法的末尾检查。
对象不变量的目的,受保护的覆盖可能是一个很好的理由被认为是"公共的"。您可能想在代码协定论坛上开始讨论。