2010-05-31 7 views
4

두 개의 코드 샘플이 있습니다. 1 개 (살)이 올바른 결과를 돌려 주어, 1 개 (살)이 null 참조 예외를 throw합니다. 차이점이 뭐야? 람다 표현식에 대한 변수를 캡처 할 때 마술 같은 일이 일어나고 있음을 알고 있습니다. 그러나 여기서 어떤 일이 일어나고 있는지 이해하지 못합니다.람다 식과 null 입력 가능 유형

  int? x = null; 
      bool isXNull = !x.HasValue; 

      // this works 
      var result = from p in data.Program 
          where (isXNull) 
          select p; 
      return result.Tolist(); 

      // this doesn't 
      var result2 = from p in data.Program 
         where (!x.HasValue) 
         select p; 
      return result2.ToList(); 
+1

아마도'return' 문의 전에 x 값을 변경하고 있습니까? –

+0

아니요. 전체 코드 샘플입니다. – Mathew

답변

1

저는 LLBLGen이 LINQ 쿼리를 구문 분석하는 방식에 대해이 점을 특이하게 설명하고 있습니다. 동일한 문제가없는 간단한 프레임 워크 전용 테스트 시나리오를 만들었습니다.

2

번째는 xreturn result2.ToList(); 실행하는 경우의 값을 사용하는 반면 제 인스턴스 라인 bool isXNull = !x.HasValue; 실행시 x했던 값에 따라 계산 isXNull. 그것은 아무런 참조를 볼 수 없기 때문에 null 참조 예외를 얻는 방법은 명확하지 않습니다.

+0

이 코드는 LLBLGen Pro에서 데이터베이스에서 데이터를 검색하는 데 사용되므로 null 참조 예외가 잘못되었을 수 있습니다. x의 값은 초기 할당 후에는 변경되지 않습니다. – Mathew

1

당신이 우리에게 어떤 데이터를 말하지 않았는지를 보여줍니다. 프로그램입니다, 제가 시도한 코드가 있습니다 ... LINQPad에서 작동했습니다.

var Program = new [] {"asd","asd"}; 

    int? x = null; 
    bool isXNull = !x.HasValue; 

    // this works 
    var result = from p in Program 
        where (isXNull) 
        select p; 


    // this doesn't 
    var result2 = from p in Program 
       where (!x.HasValue) 
       select p; 

    result.Dump(); 
    result2.Dump();