先看代码
1 double? Result = PeopleList.Sum(r => (r.Height ?? 0) / r.Width);
这里, r.Height 和 r.Width 都是 double? 类型。 如果 r.Width 有为null的情况,那结果会是什么呢?
再看个代码
double? result = 0.0d;
foreach (var r in PeopleList) { result += (r.Height ?? 0)/r.Width; }
这两种表达方式看起来没什么区别。但是在VS2010 .Net 4.0 的编译环境下。 如果 r.Width有为null的情况,第一段代码结果是 0.0d, 而相同情况下第二段代码结果为 Null .
为何如此? 我想是系统优化造成编译Lambda表达式的时候,先做了除的操作再进行是不是null的判断,和表面看上去的逻辑完全不同。这点要注意。