如果左操作数为 ??运算符不为 null,是否计算正确的操作数
本文关键字:操作数 计算 是否 运算符 如果 null | 更新日期: 2023-09-27 18:24:11
我正在考虑在 C# 中使用 ??
运算符(空合并运算符(。但是MSDN的文档是有限的。
我的问题:如果左操作数不为空,右手操作数是否会被评估?
与以往一样,C# 规范是处理此类事情的最佳选择。
来自 C# 5 规范的第 7.13 节(强调我的(:
形式
a ?? b
的 null 合并表达式要求a
为可为 null 的类型或引用类型。如果a
为非空,则a ?? b
的结果为a
;否则,结果为b
。仅当a
为 null 时,该操作才计算b
。
关于何时执行任何转换以及确切的行为,还有更多详细信息,但这是您问题的要点。还值得注意的是,零合并运算符是右关联的,因此a ?? b ?? c
被评估为 a ?? (b ?? c)
...这意味着它只会在a
和b
都为 null 时计算c
。
为什么不测试它:)
void Main()
{
var leftOrRight = left ?? right;
}
public bool? left
{
get
{
Console.WriteLine ("Left hit");
return true;
}
}
public bool right
{
get
{
Console.WriteLine ("Right hit");
return true;
}
}
问题的答案是no
...第二个值未被计算
从规范:
形式为 a ?? b 的空合并表达式要求 a 为可为空的类型或引用类型。如果 a 为非空,则 ??b 是 a;否则,结果为 b。仅当 a 为 null 时,该操作才计算 b。
(着重号后加(
看看这个。如果名称不为空,控制台将显示"我的姓名"。如果为 null,则控制台显示"已调用",然后显示"Allo"
using System;
public class Program
{
public static void Main()
{
string name = "MyName";
Console.WriteLine(name??test());
}
private static string test()
{
Console.WriteLine("Called");
return "Allo";
}
}