if'声明的条件

本文关键字:条件 声明 if | 更新日期: 2023-09-27 18:11:53

我是c#新手,但从我的理解这段代码应该可以工作。为什么它不起作用?

这是我的代码的一个例子

List<Car> cars // This has many cars initialized in it already
if (() => {
   foreach(Car car in cars){
       if (car.door == null) return true;
   }
}){then .......}

简单地说,我希望代码所做的就是在任何汽车没有门时运行if语句。

尝试编译后,我得到这个错误:

无法将lambda表达式转换为'bool'类型,因为它不是委托类型。

if'声明的条件

如果您想检查是否有任何汽车没有门,那么只需使用Enumerable.Any -它确定序列的任何元素是否满足条件:

if (cars.Any(c => c.door == null))
   // then ...

只是为了好玩:你应该在if条件下执行lambda来获得布尔结果(但在这种情况下使用Any)

Func<bool> anyCarDoesNotHaveDoor = () => { 
    foreach(var car in cars)
       if (car.door == null)
           return true;
    return false; 
};
if (anyCarDoesNotHaveDoor())
   // then ...

我引入局部变量是为了让事情更清楚。当然你可以让这个谜题更复杂

 if (new Func<bool>(() => { 
        foreach(var car in cars)
           if (car.door == null)
               return true;
        return false; })())
    // then ...    

这个错误说明了一切。if语句期待一个布尔表达式,而委托不是。如果您要调用委托(假设它返回一个bool),您就可以了。然而,if不知道调用它。

最简单的方法是使用Any LINQ扩展方法:
if (cars.Any(car => car.door == null))

Any方法知道在集合的每个成员上实际调用lambda表达式,并返回bool。这使得它成为if语句的有效布尔表达式。

如果你真的想对没有门的汽车做点什么:

foreach (var car in cars.Where(car => car.door == null)) {
    car.door = <whatever>;
}