我目前正在检查此契约,参数和返回值不为空。现在,我需要一种方法来检查无论交换机的哪个分支,所以生成的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;
}
}
答案 0 :(得分:3)
尝试
Contract.Ensures(
Contract.Result<IEnumerable<MenuItemAction>>() != null &&
Contract.Result<IEnumerable<MenuItemAction>>().Count() ==
Contract.Result<IEnumerable<MenuItemAction>>()
.Select(m => m.Code)
.Distinct()
.Count()
);
答案 1 :(得分:1)
合同的代码是什么。所有?你观察到了什么?
虽然你实际上没有要求替代方案,但我建议你考虑使用setinstead of Array。
覆盖MenuItemAction上的Equals和GetHashCode,每次你想要一组不同的项目时 - 使用Set集合。
它保证值是唯一的,如果你想知道是否遇到重复项,你需要做的就是检查Add方法的返回值。
这一切都归结为你想要实现的目标?您想确保不同的值,还是要确保没有人将相同的值放两次? (您是否试图保护内容或用途?)。
无论如何,MenueItem的代码是否可以在0-4范围之外?或者换句话说 - 如果代码是OutOfRange(提示提示: - ),那么你实际上是指方法返回null吗?