Это - мой код:
public class RegularPolygon
{
public int VertexCount;
public double SideLength;
public RegularPolygon(int vertexCount, double sideLength)
{
Contract.Requires(vertexCount >= 3);
VertexCount = vertexCount;
SideLength = sideLength;
}
[ContractInvariantMethod]
private void RegularPolygonInvariants()
{
Contract.Invariant(VertexCount>=3);
}
}
Я попробовал обоими Контракт. Требует и Контракт. Инвариантные методы, чтобы препятствовать тому, чтобы vertexCount переменная стала меньше чем или равной 2; однако я все еще могу инициализировать RegularPolygon с 2 или меньшим количеством сторон. Мой (упрощенный) тест NUnit похож на это:
[TestFixture]
class TestRegularPolygon
{
private RegularPolygon _polygon;
[SetUp]
public void Init()
{
_polygon = new RegularPolygon(1, 50);
}
[Test]
public void Constructor()
{
Assert.That(_polygon.VertexCount,Is.GreaterThanOrEqualTo(3));
}
}
Вышеупомянутый тест также передает, и я не могу выяснить почему!
Сначала я думал, что ReSharper, возможно, портил что-то, потому что он отображает строку серым и отображает это сообщение каждый раз, когда я пытаюсь использовать метод в Contract
пространство имен:
Вызов метода пропускается. Компилятор не генерирует вызов метода, потому что метод является условным выражением, или это - частичный метод без реализации.
Но приостановка R# и запущение тестов в NUnit имеют тот же результат без ошибок или предупреждений в VS также. Таким образом, я предполагаю, что это просто, потому что ReSharper еще не имеет выделяющейся совместимости для контрактов кода.
Я посмотрел на документацию и насколько я могу сказать, что у меня не должно быть этой проблемы.
Я использую контракты кода неправильно, или моя среда препятствует тому, чтобы он работал так или иначе?
Спасибо.
Первое, что нужно проверить - действительно ли у вас включена проверка контрактов? В противном случае ни один из ваших контрактов ничего не сделает. Это тоже объяснило бы предупреждение R #. Загляните в раздел «Контракты кода» в свойствах сборки и посмотрите, что написано в разделе «Проверка времени выполнения».
Согласно комментариям, убедитесь, что у вас есть CONTRACTS_FULL
, определенный как символ компиляции - похоже, это то, что требует R #.
Второй момент: у вас есть общедоступные изменяемые поля, что означает, что ваш инвариант может быть нарушен в любой момент, если кто-то напишет
polygon.VertexCount = 0;
. Пожалуйста, не используйте общедоступные поля, особенно недоступные для записи. :)