调用重载方法时,代码合约会警告参数

时间:2011-07-04 13:34:41

标签: c# .net generics code-contracts

我有这段代码(非常简单):

[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已为该参数设置的合约不为null。呼叫和被叫方法......

1 个答案:

答案 0 :(得分:1)

我在阅读这段代码时迷路了...
你确定它不会进入无限制的递归吗?

作为测试,我重命名了1个ExecuteQuery()重载(在几个地方):

 IEnumerable<Document> ExecuteQuery2(IMultiIndexQuery multiIndexQuery);

这满足了检查员。

所以也许您在分析器中发现了一个弱点,但在报告之前我会确保代码按预期工作。