gpt4 book ai didi

c#-8.0 - 为什么不能在 C# 中加入空合并赋值运算符?

转载 作者:行者123 更新时间:2023-12-03 16:19:08 29 4
gpt4 key购买 nike

空合并运算符
我最喜欢的 C# 特性之一是空合并运算符,我已经使用了很长时间:

// 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

我曾希望也许我也可以在参数验证用例中使用空合并赋值运算符,但似乎不允许这样做。这就是我想做的:
foo = foo ?? throw new ArgumentNullException(nameof(foo)); // Does compile
foo ??= throw new ArgumentNullException(nameof(foo)); // Does not compile
谁能解释为什么空合并赋值运算符适用于“如果不存在则获取”场景而不适用于参数验证场景?
https://dotnetfiddle.net/W8cNPo
免责声明
我意识到 ... ??= throw ...事情可能不是最易读的方式来做到这一点。我的问题与样式/可读性无关,因为它只是想了解这个运算符的一个怪癖。
谢谢!

最佳答案

??的答案相当简单。它只是按照 documentation 中所述的方式实现的:

The null-coalescing operator ?? returns the value of its left-hand operand if it isn't null; otherwise, it evaluates the right-hand operand and returns its result. The ?? operator doesn't evaluate its right-hand operand if the left-hand operand evaluates to non-null.

??= throw的答案有点棘手。似乎这会很有用(或者从开发人员的角度来看可能是一致的),但这是有原因的。如果您深入了解 C# 8.0 Null Coalescing Assignment proposal??=运算符(operator),您遇到了这一行(我的重点是补充):

Otherwise, the type of a ??= b is A. a ??= b is evaluated at runtime as a ?? (a = b), except that a is only evaluated once.


这意味着您的作业将评估为
foo ?? (foo = throw new ArgumentNullException(nameof(foo)))
这在语法上无效。
他们必须那样实现吗?不,他们可以以不同的方式实现它,但他们没有。提案接着说这个

As with any language feature, we must question whether the additional complexity to the language is repaid in the additional clarity offered to the body of C# programs that would benefit from the feature.


看起来在这里,额外的复杂性不被认为是有必要的,因为替代方案非常好。
借用 Julien 对这个问题的评论(谢谢!), meeting notes提供更多背景信息

Throw expression on the right-hand side

Should the following be allowed: a ??= throw new Exception? throw expressions are only allowed in certain places right now, so we would have to explicitly add support. It makes more sense if the feature is equivalent to a = a ?? b where b is a throw, than a ?? (a = b).

Conclusion

Not supported

关于c#-8.0 - 为什么不能在 C# 中加入空合并赋值运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67321083/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com