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

У меня есть какой-то фабричный метод

    public T Create<T> () where T : class 
    {
        Contract.Ensures(Contract.Result<T>() != null);

        T result = this.unityContainer.Resolve<T>();

        return result;
    }

Я пытаюсь создать проект, который я получаю предупреждение:

CodeContracts: обеспечивает недоказанность: Contract.result () ! = NULL

Я понимаю, что интерфейс IunityContainer не имеет никаких договоров, поэтому кодовые контракты считают, что варьируемые могут быть нулевыми, и нет способа доказать, что создание () вернет не нулевой результат.

Как в этом случае я могу сделать кодовые контракты верять, что Результат Результат Переменная не нулевая?

Я впервые попытался позвонить Conture.assert

    public T Create<T> () where T : class 
    {
        Contract.Ensures(Contract.Result<T>() != null);

        T result = this.unityContainer.Resolve<T>();

        Contract.Assert(result != null);

        return result;
    }

, но это требует меня другое предупреждение:

CodeContracts: Assert donfoven

Я попробовал сделать чек на NULL, и это делает все предупреждения:

    public T Create<T> () where T : class 
    {
        Contract.Ensures(Contract.Result<T>() != null);

        T result = this.unityContainer.Resolve<T>();

        if (result == null)
        {
            throw new InvalidOperationException();
        }

        return result;
    }

, но я не уверен, что это хорошее решение, чтобы бросить исключение вручную. Может быть, есть какой-то способ решить проблему только с использованием кодовых контрактов?

Спасибо.

10
задан Henk Holterman 17 September 2011 в 21:09
поделиться