0

現在、このコントラクトを使用して、パラメーターと戻り値がnullではないことを確認しています。ここで、スイッチのどのブランチを使用する場合でも、結果のIEnumerableのコード値が重複していないことを確認する方法が必要です。これはコードコントラクトを使用して可能ですか?私はContract.ForAllを使おうとしていますが、運がありません。

internal static IEnumerable<MenuItemAction> GetMenuActions(MenuItem menuItem)
{
    Contract.Requires(menuItem != null);
    Contract.Ensures(Contract.Result<IEnumerable<MenuItemAction>>() != null);

    switch (menuItem.Code)
    {
        case 0:
            return new MenuItemAction[3] { 
        new MenuItemAction(){Code = 0, Label = "."}, 
        new MenuItemAction(){Code = 1, Label = ".."}, 
        new MenuItemAction(){Code = 2, Label = "..."}
    };
        case 1:
            return new MenuItemAction[2] { 
        new MenuItemAction(){Code = 3, Label = "."}, 
        new MenuItemAction(){Code = 4, Label = ".."}
    };
        case 2:
            return new MenuItemAction[2] { 
        new MenuItemAction(){Code = 5, Label = "."}, 
        new MenuItemAction(){Code = 6, Label = ".."}
    };
        default: return null;
    }
}
4

2 に答える 2

3

試す

Contract.Ensures(
    Contract.Result<IEnumerable<MenuItemAction>>() != null &&
    Contract.Result<IEnumerable<MenuItemAction>>().Count() == 
        Contract.Result<IEnumerable<MenuItemAction>>()
           .Select(m => m.Code)
           .Distinct()
           .Count()
);
于 2012-08-25T19:37:26.720 に答える
1

contract.ForAll のコードは何ですか? 何を観察しましたか?

実際には代替案を求めていませんが、配列の代わりにセットを使用することを検討することをお勧めします。

MenuItemAction で Equals と GetHashCode をオーバーライドし、個別の項目のコレクションが必要になるたびに Set コレクションを使用します。

値が一意であることを保証し、重複が発生したかどうかを知りたい場合は、Add メソッドの戻り値を確認するだけです。

それはすべて、正確に何を達成したいのかに帰着しますか? 明確な値を確保したいですか、それとも誰も同じ値を 2 回入力しないようにしたいですか? (コンテンツまたは使用法を保護しようとしていますか?)。

それにもかかわらず、MenueItem のコードは 0 ~ 4 の範囲外にすることができますか? または言い換えれば、コードが OutOfRange の場合にメソッドが null を返すことを実際に意味しますか (ヒント :-))

于 2012-08-25T19:35:46.867 に答える