Код контракта предупреждает о параметре при вызове перегруженного метода - PullRequest
1 голос
/ 04 июля 2011

У меня есть этот код (очень урезанный):

[ContractClass(typeof (QueryServiceContract))]
public interface IQueryService
{
    IEnumerable<Document> ExecuteQuery(IMultiIndexQuery multiIndexQuery);

    IEnumerable<T> ExecuteQuery<T>(IMultiIndexQuery multiIndexQuery) where T : class;
}

[ContractClassFor(typeof (IQueryService))]
public abstract class QueryServiceContract : IQueryService
{
    public IEnumerable<Document> ExecuteQuery(IMultiIndexQuery multiIndexQuery)
    {
        Contract.Requires(multiIndexQuery != null);
        Contract.Ensures(Contract.Result<IEnumerable<Document>>() != null);
        return null;
    }

    public IEnumerable<T> ExecuteQuery<T>(IMultiIndexQuery multiIndexQuery) where T : class
    {
        Contract.Requires(multiIndexQuery != null);
        Contract.Ensures(Contract.Result<IEnumerable<T>>() != null);
        return null;
    }
}

public class QueryService : IQueryService
{
    public IEnumerable<Document> ExecuteQuery(IMultiIndexQuery multiIndexQuery)
    {
        throw new NotImplementedException();
    }

    public IEnumerable<T> ExecuteQuery<T>(IMultiIndexQuery multiIndexQuery) where T : class
    {
        ExecuteQuery(multiIndexQuery); // This is the row code contracts complain about.
        throw new NotImplementedException();
    }
}

public class Document
{
}

public interface IMultiIndexQuery
{
}

Кодекс контрактов дает мне это предупреждение: CodeContracts: требуется бездоказательно: multiIndexQuery! = Null

Почему я получаю это предупреждение? QueryServiceContract установил контракт для этого параметра, который не является нулевым. И в вызове, и в вызываемом методе ...

1 Ответ

1 голос
/ 04 июля 2011

Я тоже заблудился, читая этот код ...
Вы уверены, что это не входит в неограниченную рекурсию?

В качестве теста я переименовал 1 из перегрузок ExecuteQuery () (в нескольких местах):

 IEnumerable<Document> ExecuteQuery2(IMultiIndexQuery multiIndexQuery);

И это удовлетворяет контролеру.

Так что, возможно, вы обнаружили слабость в анализаторе, но прежде чем сообщать об этом, я бы удостоверился, что код работает, как ожидалось.

...