Я только начал использовать CodeContracts с C #, и мне может понадобиться помощь. У меня есть класс со статическим списком ключей, и у меня есть статический метод Remove (), который удаляет ключ из этого списка.
Теперь из условий публикации контрактов я понимаю, что, будучи программистом класса, я гарантирую, что текущий публичный метод сделает что-то конкретное, в данном случае: удаление элемента списка.
Вот что я написал:
private static List<Keys> m_usedKeys; // private list of keys
public static void Remove(Keys _key)
{
m_usedKeys.Remove(_key);
Contract.Ensures(!m_usedKeys.Any(x => x == _key));
}
Здесь я пытаюсь «убедиться» в том, что метод Remove () удаляет ключ real из списка (да, это может быть тривиальный пример, но я получаю ошибку там).
когда я пишу строку Contract.Ensures (), VS2010 выдает мне следующую ошибку:
Error 3 Detected expression statement evaluated for potential side-effect in contracts of method 'LibJungleTimer.KeyBind.Remove(System.Windows.Forms.Keys)'. (Did you mean to put the expression into a Requires, Ensures, or Invariant call?) C:\Users\Joel\Documents\Programmation\JT\JungleTimer\LibJungleTimer\KeyBind.cs 51
Я думаю, что эта ошибка говорит о том, что выражение m_usedKeys.remove(_key);
имеет потенциальный побочный эффект. Фактически, у него есть побочный эффект, он удаляет ключ из списка!
Если я попытаюсь написать что-то вроде этого:
Contract.Assert(!m_usedKeys.Any(x => x == _key));
ну, это хорошо компилируется. Мой вопрос: что я делаю не так? Разве CodeContracts не должен использоваться таким образом, чтобы обеспечить условия публикации?
РЕДАКТИРОВАТЬ: Да, я действительно имел в виду! M_usedKeys.Any (...);