2010-05-31 62 views
4

我有两个代码示例。一个工作并返回正确的结果,一个抛出一个空引用异常。有什么不同?我知道在捕获lambda表达式的变量时会发生一些魔法,但我不明白幕后的情况。Lambda表达式和可空类型

  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的值吗? – 2010-05-31 03:48:18

+0

不是。这是整个代码示例。 – Mathew 2010-05-31 03:56:55

回答

1

我把这归结为LLBLGen解析LINQ查询的方式的一个特点。我创建了一个简单的仅限框架的测试场景,它不具有相同的问题。

2

第一个实例基于该值,执行线bool isXNull = !x.HasValue;x有计算isXNull,而第二个使用的xreturn result2.ToList();执行的值。但是,如何获得空引用异常尚不清楚,因为我没有看到任何引用。

+0

空引用异常可能会引起误解,因为LLBLGen Pro使用此代码从数据库检索数据。在初始分配后的任何点,x的值都不会改变。 – Mathew 2010-05-31 03:54:18

1

看到你还没有告诉我们什么data.Program是,这里是我尝试过的一些代码,它的工作...在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();