2011-08-08 2 views
2

내가 경고를 보고 여러 가지 방법이 "코드 계약하기 : 증명이 필요합니다! 생성자를 NULL ="는 C# CodeContracts 정적 검사가 활성화 된 경우.'CodeContracts를 진단하려면 unproven이 필요합니다. 생성자! = null'?

이 특정 방법은 계약을 선언하지 않고, 어떻게 어떤 방법으로 호출되지 않습니다. 내가 경고를 두 번 클릭하면

는 시각적 인 스튜디오는 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()이 호출 된 것 같습니다.

어떤이는 CodeContracts 정적 검사와 함께해야 하는가? 또한, 왜 검사기가 불평하고, 그것을 해결하기 위해 할 수 있습니까?

+0

ToList()를 호출하기 전에 null 평등에 대한 쿼리를 확인할 수 있습니까? –

+0

시도해 보았습니다.하지만 Resharper는 표현식'(query! = null)'은 항상 true로 평가됩니다. 나는 Resharper의 충고를 무시하고 질의에 대한 null check로 다시 작성하기도했지만 아무런 효과가 없었다. – Rob

+0

제목 앞에 "C#"을 붙이지 마십시오. 그것이 바로 태그입니다. –

답변

3

여기에 버그가있는 것 같습니다. 다음

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

: 당신이 코드를 변경하는 경우

IQueryable<IStudentTermData> query = 
    studentTermDataSet.Join(studentSet, 
          studentTermData => studentTermData.StudentId, 
          student => student.Id, 
          (studentTermData, student) => new {studentTermData, student}) 
         .Where(s => (s.student.Active)) 
         .Select(std => std.studentTermData); 

"생성자"라는 유일한 매개 변수가 실제로 Join 방법의 마지막 매개 변수이며, :에

조회에서 desugars 그것은 경고없이 컴파일됩니다.

차이는 두 번째는 Func 소요 (IEnumerable 및 반환) 반면, 첫 번째 질의, 매개 변수로 Expression 걸리는 Join 과부하를 사용한다는 것이다.

그래서 나는 식 트리에 대한 지원 가능성이 아직 완료되지라고 생각합니다. 당신은 Code Contracts forum에 대한 질문을 게시 할 수 있습니다.