我有这样的代码:
if (a() && b != null) {
b.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
a()即使b是,我也需要副作用null.它是由C#保证的吗?或者C#可以省略a()呼叫,如果b是null?
Aak*_*shM 118
是的,a()将始终进行评估.
由于条件是从左到右计算的,因此a()将始终进行评估,但b != null仅在a()返回时 进行评估true.
以下是C#语言规范3.0版的精确规范参考.我的重点和精神.
7.11.1布尔条件逻辑运算符
当[
&&或]||类型的操作数操作bool如下处理时:
- 该操作
x && y被评估为x ? y : false.换句话说,x是 第一评估并转换为bool类型.然后,如果x为true,则计算y并将其转换为bool类型,这将成为操作的结果.否则,操作的结果为false.
Jan*_*oom 31
是的,表达式从左到右进行评估; 所以a()永远都会被召唤.
参见C#语言规范(ECMA 334,第8.5段):
除赋值运算符外,所有二元运算符都是左关联运算符,这意味着操作从左到右执行.例如,x + y + z被评估为(x + y)+ z.