0

Code Contracts の最新情報を取得しようとしています。私には意味をなさない別の問題があります:

これは不変式です:

[ContractInvariantMethod]
    void Invariant() {
        Contract.Invariant(this._uiRoot.RowDefinitions!=null);
    }

次に、メソッドには次のコードがあります。

int colunmn = 0;
foreach (UIElement uiElement in row.Where(element => element!=null))
{
            if (uiElement != null)
            {
                uiElement.SetValue(Grid.ColumnProperty, colunmn++);
                uiElement.SetValue(Grid.RowProperty, _uiRoot.RowDefinitions.Count - 1);
                _uiRoot.Children.Add(uiElement);
            }
}

Invariant にもかかわらず、_uiRoot.RowDefinitions が null である可能性があるという警告が表示されます。すべてのパブリックメソッド呼び出しとコンストラクターの後にチェックされている場合、CodeContracts がそれを考える理由がわかりません。問題のコードはカスタム フォーム デザイナーであり、さまざまなメソッドで uiRoot.RowDefinitions を使用しているため、インバリアントに入れたいと考えました。警告を止めるにはこれで十分だと思いました。

4

1 に答える 1

1

不変はパブリック プロパティへのアクセスでのみ実行されると思います。RowDefinitions プロパティ自体に契約を追加することは可能ですか? あなたの不変条件は、プロパティが null にならないことを証明できません。不変条件の実行後にその型を null に設定するメソッドを呼び出すことができます。

于 2013-06-13T01:24:13.487 に答える