2011-08-08 22 views
2

當C#CodeContracts靜態檢查器已啓用時,我有幾種方法報告警告「代碼合同:要求未經證實:構造函數!= null」診斷'CodeContracts需要未經證實:構造函數!= null'?

這些特定的方法不會聲明任何合約,也不會被任何方法調用。

如果我雙擊警告,visual studio會引導我執行對象的行。下面是有問題的方法之一:

public List<IStudentTermData> GetAllActive() 
{ 
    using (IObjectContext context = ContextFactory.Create()) 
    { 
     var studentTermDataSet = context.ObjectSet<IStudentTermData>(); 
     var studentSet = context.ObjectSet<IStudent>(); 

     // Helps out CodeContracts static checker 
     if(studentSet == null || studentTermDataSet == null) 
      return new List<IStudentTermData>(); 

     // Selecting the warning brings me to the next line 
     IQueryable<IStudentTermData> query = 
      from studentTermData in studentTermDataSet 
      join student in studentSet 
      on studentTermData.StudentId equals student.Id 
      where (student.Active) select studentTermData; 

     return query.ToList(); 
    } 
} 

我有沒有表現出這樣的警告其他幾個非常類似的方法,我注意到他們不使用LINQ加入。我猜測我的LINQ查詢正被解構成一些(可能爲null)IQueryable對象,它會調用Join(),導致此警告。

這與CodeContracts靜態檢查器有什麼關係?另外,爲什麼檢查者抱怨,我該怎麼做才能解決這個問題?

+0

可能在調用ToList()之前檢查查詢是否爲null等於? –

+0

我試過了,但是Resharper表示'(query!= null)'總是會評估爲true。我甚至忽略了Resharper的建議,並用查詢的空檢查重建,並沒有任何效果。 – Rob

+0

請勿在「C#」前添加標題。這就是標籤的用途。 –

回答

3

這裏似乎有一個錯誤。

您的查詢desugars到:

​​

所謂的「構造」唯一的參數是Join方法的最後一個參數,而事實上,如果你的代碼更改爲:

var query = 
    studentTermDataSet.Join(studentSet, 
          studentTermData => studentTermData.StudentId, 
          student => student.Id, 
          Tuple.Create); 

然後它編譯沒有警告。

所不同的是在第一查詢使用Join過載它接受一個Expression作爲參數,而第二個需要Func(並返回一個IEnumerable)。

所以我認爲表達式樹的支持可能還沒有完成。您可以在Code Contracts forum上發帖提問。