Lambda表达式和可空类型

时间:2010-05-31 03:36:38

标签: c# linq 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();

3 个答案:

答案 0 :(得分:2)

第一个实例根据执行第isXNull行时的值x计算bool isXNull = !x.HasValue;,而第二个实例在{{1}时使用x的值执行。但是,目前尚不清楚如何获得空引用异常,因为我没有看到任何引用。

答案 1 :(得分:1)

我认为这与LLBLGen解析LINQ查询的方式有关。我创建了一个简单的仅框架测试场景,它没有相同的问题。

答案 2 :(得分: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();