0

私は、C# でコントラクトを使用してコーディングを開始しました。以下のプロパティをC#で表現したい

ISet<Tuple<A,B>> set;
Contract.Requires(!Contract.Exists(set, (e1,e2) => (((e1 != null) && (e2 != null)) &&    (e1.Item1 == e2.Item1) && (e1.Item2 != e2.Item2))));

つまり、2 つのタプルの最初の要素が同じ場合、2 番目の要素も同じでなければなりません。

ここでの問題は、(e1,e2) => ... が 2 つの引数のために有効な式ではないことです。e1とe2の両方でこの契約を表現する方法はありますか? あるいはどう書き直すか。

4

2 に答える 2

2

テンプレの説明ありがとう。私が言いたかったのは次のことです。

\forall s,t in ISet< Tuple< A,B>>: (sa==ta) -> (sb==tb)

なんとなくわかりにくかったと思います。私は最終的に次の方法で解決しました(以前は、Contract.ExistとContract.ForAllをネストできることを知らず、ロジックを再構築した後)

ISet<Tuple<A,B> set;
Contract.Invariant(Contract.ForAll(set, s => s != null && Contract.ForAll(set, t => t != null && ((s.Item1 != t.Item1)||(s.Item2 == t.Item2)))));
于 2014-04-22T06:42:39.843 に答える
1

のテンプレート引数Contract.Exist()はコレクション要素なので、あなたの場合Tuple<A, B>です。それらを切り離すことはできません( for templateがであるため、ABfrom )。Tuple<A, B>ISet<T>TTuple<A, B>

次のように書き換えます(タプルの要素が等しくなくnull、変更する場合に備えて、必要であることがわかった場合):

Contract.Requires(!Contract.Exists(set,
    x => x.Item1 == null || x.Item2 == null || x.Item1 == x.Item2));
于 2014-04-17T12:37:23.677 に答える