【问题标题】:Lambda expressions and nullable typesLambda 表达式和可为空的类型
【发布时间】:2025-12-19 03:45:06
【问题描述】:

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

【问题讨论】:

  • 您是否在 return 声明之前更改了 x 的值?
  • 不。这是整个代码示例。

标签: c# linq lambda


【解决方案1】:

第一个实例根据bool isXNull = !x.HasValue; 行执行时x 的值计算isXNull,而第二个实例在return result2.ToList(); 执行时使用x 的值。不过,尚不清楚您是如何获得空引用异常的,因为我没有看到任何引用。

【讨论】:

  • 空引用异常可能会产生误导,因为 LLBLGen Pro 使用此代码从数据库中检索数据。 x 的值在初始赋值后的任何时候都不会改变。
【解决方案2】:

我将此归结为 LLBLGen 解析 LINQ 查询的方式的特殊性。我创建了一个没有相同问题的简单框架测试场景。

【讨论】:

    【解决方案3】:

    看到你还没有告诉我们什么是 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();
    

    【讨论】: