0

次のコードがあるとします。

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 は常に「Invariant failed」例外で失敗します。

不変条件に基づいて InvariantTest.Method を失敗させるにはどうすればよいですか?

実行時チェックを完全に設定し、「呼び出しサイトにはチェックが必要」を有効にしましたが、それでも役に立ちません。

4

1 に答える 1

0

最新バージョン (1.4.50910.0) を使用すると、静的チェッカーから、不変式が false であるという警告が表示されます。

ただし、ランタイムの場合、これは意図された動作です。マニュアルから:

ランタイム チェック中に、各 public メソッドの最後で不変条件がチェックされます。

オブジェクトの不変条件の目的で、保護されたオーバーライドが「パブリック」と見なされるのはおそらく良いケースです。Code Contracts フォーラムでディスカッションを開始することをお勧めします。

于 2012-10-16T01:20:23.057 に答える