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

标签 c#

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

相关文章:

c# - 迭代字符数组时检查两个条件

c# - 绑定(bind)ContentControl内容以获取动态内容

c# - 如何在 ListView 控件 header 上复制 Windows 资源管理器列筛选

c# - 请求被中止 : Could not create SSL/TLS secure channel

c# - ASP.NET Core API Controller : Response. Body.WriteAsync base64 字符串不起作用

c# - 使用Xpcom.Shutdown(),Xpcom.Initialize(path)后的GeckoFx不能再使用

c# - 比 ffmpeg 更快的帧提取

c# - System.Threading.Timer 回调永远不会被调用

c# - 如何更新模型状态?

c# - 服务器协议(protocol)冲突错误