2011-08-08 3 views
2

私は警告報告し、いくつかの方法持っている「コード契約を:コンストラクタ= nullを!:証明されていない必要があり、」C#CodeContracts静的チェッカが有効になっている場合を。'CodeContractsの診断には検証が必要です:コンストラクタ!= null'?

これらの特定の方法は、任意の契約を宣言していない、と行う任意の方法によって呼び出されていません。

私は警告をダブルクリックすると、Visual StudioはIQueryable<TEntity>オブジェクトをインスタンス化ラインに私を指示します。ここで問題のある方法の一つです:

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クエリがJoin()が呼び出されてこの警告の原因となるいくつかの(おそらくnull)IQueryableオブジェクトに分解されていると推測しています。

何これはCodeContracts静的チェッカーと関係があるのでしょうか?また、チェッカーが不平を言っている理由と、それを修正するために何ができるのですか?

+0

多分()ToListメソッドを呼び出す前にnullの平等のためのクエリを確認しますか? –

+0

私はそれを試みましたが、Resharperは式 '(query!= null)'は常にtrueと評価します。私はResharperのアドバイスを無視し、クエリのヌルチェックで再構築しても何の効果もありませんでした。 – Rob

+0

タイトルに「C#」というプレフィックスを付けないでください。それはタグのためのものです。 –

答えて

3

ここにバグがあるようです。

あなたのクエリはにdesugars:その後、

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

:あなたがにコードを変更した場合、確かに「コンストラクタ」と呼ばれる唯一のパラメータはJoinメソッドの最後のパラメータである

​​

、および警告なしでコンパイルされます。

差は、最初のクエリは、二つFuncをとる(およびIEnumerableを返す)に対し、パラメータとしてExpressionかかりJoinオーバーロードを使用することです。

私は表現木のサポートがまだ完全ではないと考えています。あなたはこれについて質問するためにCode Contracts forumに質問を投稿することができます。

関連する問題