2011-07-04 44 views
1

我有這個代碼(非常精簡):代碼合同發出警告參數時調用重載方法

[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

我迷路了,同時閱讀此代碼...
你確定它不會進入無限遞歸嗎?

作爲測試我改名的executeQuery()過載1(在幾個地方):

IEnumerable<Document> ExecuteQuery2(IMultiIndexQuery multiIndexQuery); 

,並且滿足了檢查。

所以,也許你發現分析器的弱點,但在報告之前,我會確保代碼按預期工作。

+0

沒辦法,這可能是無限遞歸。如果沒有通用參數,調用ExecuteQuery將無法解決問題。沒有包含該類型信息的參數。 我已經報告了一個關於此的錯誤:https://connect.microsoft.com/VisualStudio/feedback/details/678828/code-contracts-warns-about-parameter-when-calling-overloaded-method – Allrameest