Я реализую этот простой контракт неправильно?

Это - мой код:

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 еще не имеет выделяющейся совместимости для контрактов кода.

Я посмотрел на документацию и насколько я могу сказать, что у меня не должно быть этой проблемы.

Я использую контракты кода неправильно, или моя среда препятствует тому, чтобы он работал так или иначе?

Спасибо.

17
задан Nobody 11 August 2010 в 19:27
поделиться

1 ответ

Первое, что нужно проверить - действительно ли у вас включена проверка контрактов? В противном случае ни один из ваших контрактов ничего не сделает. Это тоже объяснило бы предупреждение R #. Загляните в раздел «Контракты кода» в свойствах сборки и посмотрите, что написано в разделе «Проверка времени выполнения».

Согласно комментариям, убедитесь, что у вас есть CONTRACTS_FULL , определенный как символ компиляции - похоже, это то, что требует R #.

Второй момент: у вас есть общедоступные изменяемые поля, что означает, что ваш инвариант может быть нарушен в любой момент, если кто-то напишет

polygon.VertexCount = 0;

. Пожалуйста, не используйте общедоступные поля, особенно недоступные для записи. :)

18
ответ дан 30 November 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: