【发布时间】:2021-04-29 16:03:04
【问题描述】:
空合并运算符
我最喜欢的 C# 功能之一是 null-coalescing 运算符,我已经使用了很长时间:
// Simple fallback
var foo = specifiedValue ?? fallbackValue;
// Fetch if not present
foo = foo ?? getAFoo();
// Parameter validation
foo = foo ?? throw new ArgumentNullException(nameof(foo));
// Combination of the two previous examples
foo = foo ?? getAFoo() ?? throw new Exception("Couldn't track down a foo :( ");
空合并赋值运算符
我也喜欢新的 C# 8 运算符,它缩短了“如果不存在则获取”用例:
foo = foo ?? getAFoo(); // null-coalescing
foo ??= getAFoo(); // null-coalescing assignment
问题
我曾希望也许我也可以在参数验证用例中使用 null-coalescing 赋值运算符,但似乎不允许这样做。这就是我想做的:
foo = foo ?? throw new ArgumentNullException(nameof(foo)); // Does compile
foo ??= throw new ArgumentNullException(nameof(foo)); // Does not compile
谁能解释为什么 null-coalescing 赋值运算符适用于“如果不存在则获取”场景而不适用于参数验证场景?
https://dotnetfiddle.net/W8cNPo
免责声明
我意识到... ??= throw ... 这件事可能不是最易读的方法。我的问题不是关于样式/可读性,而是试图理解这个运算符的一个怪癖。
谢谢!
【问题讨论】:
-
会“因为它不是为了这样做吗?”一个可以接受的答案?
-
有点模糊,也许 :) 我只是好奇,因为我认为这种行为与 ??操作员,所以我很惊讶地看到它们在这种情况下不能类似地工作。我不知道这是否指向我不知道的一些根本差异,这可能会产生其他有助于了解的含义。
标签: c#-8.0