我有两个代码示例。一个工作并返回正确的结果,一个抛出一个空引用异常。有什么不同?我知道在捕获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();
答案 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();