C# 合并运算符有三个可能的返回值?

3

我正在查阅这个运算符??的规格,它会取左侧的值,如果为空,则返回右侧的值。

我的问题是,我能否让它返回三个可能的值呢?

类似这样:

int? y = null;
int z = 2;

int x = y ?? (z > 1 ? z : 0);

这是可能的吗?

3
当你尝试过它时发生了什么? - Jonesopolis
4个回答

2

您的代码已经很合法。您还可以尝试这样写:

int x = a ?? b ?? c;

但是如果a和/或b不可为空,这将无法工作,对吗? - Solomon Closson
没错。?? 用于可空类型。但这是一种你可以用来在三个值之间选择的方法。 - Paul

2
当然可以 - 你可以像使用其他二元运算符一样使用??,这意味着你可以在其左侧和/或右侧放置任何表达式。
例如,你可以这样做:
int? a = ...
int? b = ...
int? c = ...
int? d = ...
int? res = (condition_1 ? a : b) ?? (condition_2 ? c : d);

这个表达式将首先计算(condition_1 ? a : b),检查它是否为null,然后使用非空值作为结果,或者计算右侧并将其用作结果。

您还可以像这样“链接”null coalesce运算符??

int? res =a ?? b ?? c ?? d;

评估这个表达式是从左到右进行的。

我不理解这个链式调用...它是如何工作的?你必须在int的末尾加上问号才能使其以这种方式工作吗? - Solomon Closson
1
@SolomonClosson ?? 表达式要求其左侧为可空类型,因此在我上面的示例中,abc 必须是 int?d 可以是 int?int。链式表达式从左到右进行评估 - 首先是 a??b,然后是 (a??b)??c,最后是 ((a??b)??c)??d - Sergey Kalinichenko
好奇的是,如果我想对一个Dictionary<string, string>进行操作,以便在找不到键时放入默认值,应该怎么做呢?是这样做吗:Dictionary<string?, string> myDictionary = new Dictionary<string?, string>();然后我能这样做吗:string theKey = myDictionary["keyNotinDictionary"] ?? "Not Found"; - Solomon Closson
1
@SolomonClosson 不需要。首先,Dictionary<K,V>是引用类型,即它已经是可空的,所以您不需要使用??。其次,当键不存在且您调用dict[...]时,Dictionary会抛出异常。不幸的是,您不能在一行中完成它 - 最好的方法是两行:string res; string theValue = myDictionary.TryGetValue("keyNotinDictionary", out res) ? res : "Not Found"; - Sergey Kalinichenko

2
??是一个二元运算符,但第二个操作数(右侧)可以是任何你想要的表达式(只要它具有合适的返回类型与第一个操作数合并)。因此,是的,第二个操作数可以是(z > 1 ? z : 0)。这并不意味着??有3个可能的返回值。

好的,谢谢。我只是想确认这是一个有效的思考过程。 - Solomon Closson

1

是的,这是可能的。 尝试编译并进行一些测试,您应该自行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接