Вопрос по Code Contracts
От: 0K Ниоткуда  
Дата: 27.07.10 21:58
Оценка:
Кто может пояснить на примере. Есть программа:

using System.Diagnostics.Contracts;

namespace ConsoleApplication16
{
    class Program
    {
        public class Order
        {
            private decimal _orderPrice;

            [ContractInvariantMethod]
            private void objectInvariant()
            {
                Contract.Invariant(_orderPrice >= 0, "Цена не может быть меньше нуля.");
            }
        }

        static void Main(string[] args)
        {
            var o = new Order();
        }
    }
}


При запуске компиляции Warning: Warning 2 CodeContracts: ConsoleApplication16.Program+Order.#ctor()[0x6]: invariant unproven: _orderPrice >= 0 (Цена не может быть меньше нуля.) 1 1 ConsoleApplication16


Вроде _orderPrice приватная, внутри класса не вызывается вообще и всегда >= 0. Как нужно доказать компилятору, что она всегда >=0?
Re: Вопрос по Code Contracts
От: kvasya  
Дата: 28.07.10 04:17
Оценка:
Здравствуйте, 0K, Вы писали:

0K>Вроде _orderPrice приватная, внутри класса не вызывается вообще и всегда >= 0. Как нужно доказать компилятору, что она всегда >=0?


Инициализировать ее?
Re: Вопрос по Code Contracts
От: toulon Россия  
Дата: 28.07.10 07:07
Оценка: 8 (2)
Здравствуйте, 0K, Вы писали:

странно, если decimal поменять на double, то все нормально проходит
наверно надо копать в сторону decimal, что то с ним не то...

или можно сделать так
Contract.Invariant((double)_orderPrice >= 0, "Цена не может быть меньше нуля.");
Re: Вопрос по Code Contracts
От: nikov США http://www.linkedin.com/in/nikov
Дата: 28.07.10 07:23
Оценка: 8 (2)
Здравствуйте, 0K, Вы писали:

0K>Вроде _orderPrice приватная, внутри класса не вызывается вообще и всегда >= 0. Как нужно доказать компилятору, что она всегда >=0?


К сожалению, механизм контрактов (равно как и Pex) не понимает тип decimal. Для них он является неким непрозрачным типом с неизвестным поведением. Попробуй заменить на int или long.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.