gpt4 book ai didi

c# - 不一致的初始化语法

转载 作者:行者123 更新时间:2023-11-30 19:15:24 25 4
gpt4 key购买 nike

在 C# 中,以下是有效的语法,这是有道理的:

string[] v = {"a","b"};

但现在考虑一下。假设我们定义

void method(string[] p) {...};

那么以下是无效的:

method({"a","b"});

与上述不一致

是否有技术原因阻止此处的方法调用成为有效语法?也就是说,语法的解释是否有歧义?或者是否存在内存管理或持久性问题导致无法实现?

编辑:埃里克·利珀特 (Eric Lippert) 下面的回答很有趣——但它回答了设计的“原因”,而我实际上并没有问这个问题(事实上,这个问题最初是关闭的,因为它看起来好像我在问他的答案)。

L.B 的回答可能确实不是最初的“原因”,这种语法是不允许的(根据 Eric L. 评论)。然而,到目前为止,L.B 的回答肯定是不允许使用这种语法的正确技术原因,这实际上是我问的问题,所以我选择选择 L.B 的答案是正确的(尽管老实说它是一个艰难的选择...)。

最佳答案

简短的回答:这是一个奇怪的语法。我一直认为这是一个“疣”。您可以通过多种方式来看待这件事并说它很奇怪。奇怪的是,这是少数几种情况之一:

T x = y;

T x; x = y;

是不同的。或者,另一种看待它的方式是,局部变量初始值设定项是一个可以出现不是表达式的内容的上下文,这很奇怪。

或者另一种看待它的方式真的很奇怪,这是创建新数组但"new"没有出现在任何地方的唯一情况。

或者另一种看待它的方式是,数组可以像这样初始化真的很奇怪,但没有其他集合构造可以。它使数组看起来特别特别和重要,即使它们通常不是完成这项工作的正确工具。

我认为如果我们必须重新做一遍,初始化器可能需要在它们的左边添加 new[]

Are there technical reasons that preclude the method call here from being valid syntax? That is, is there some ambiguity in interpretation of the syntax?

不是真的。不要过多解读这种怪事。我的建议是完全避免语法;坚持使用适当的集合初始值设定项或数组初始值设定项。它们具有几乎完全相同的语法,但在表达式合法的任何地方都是合法的。

关于另一个答案,L.B.:虽然这个答案振振有词地指出这里存在设计问题,但它忽略了历史视角。受到批评的功能是在 C# 1.0 中创建的,比泛型类型推断 (C# 2.0) 或其他大括号集合初始值设定项 (C# 3.0) 添加早了很多年。因此,不能根据与多年后出现的功能的某些冲突来为 1.0 功能的设计选择辩护。 C# 设计团队试图向前看,但他们不是前瞻性的!

关于c# - 不一致的初始化语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39498662/

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