C# 不一致的初始化语法

C# 不一致的初始化语法,c#,C#,在C语言中,以下是有效的语法,这很有意义: string[] v = {"a","b"}; 但是现在考虑一下这个问题。假设我们定义 void method(string[] p) {...}; 那么以下内容无效: method({"a","b"}); 这与上述情况不一致 是否有技术原因阻止此处的方法调用成为有效语法?也就是说,在解释语法时是否存在一些歧义?或者内存管理或持久性是否存在一些问题,使其无法实现 编辑: Eric Lippert下面的回答很有趣,但它回答了设计的原因,我并没有问这

在C语言中,以下是有效的语法,这很有意义:

string[] v = {"a","b"};
但是现在考虑一下这个问题。假设我们定义

void method(string[] p) {...};
那么以下内容无效:

method({"a","b"});
这与上述情况不一致

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

编辑: Eric Lippert下面的回答很有趣,但它回答了设计的原因,我并没有问这个问题,事实上,这个问题最初是封闭的,因为它看起来好像我在问他的答案


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

假设你有另一种方法

void method(KeyValuePair<string,string> p) {}

简短的回答:这是一个奇怪的语法。我一直认为这是一个疣。有很多方法可以让你看到这件事,然后说它很奇怪。奇怪的是,这是为数不多的几种情况之一:

T x = y;

它们是不同的。或者,从另一个角度来看,奇怪的是,局部变量初始值设定项是一个非表达式的内容可以出现的上下文

或者从另一个角度来看,这是唯一一种创建了新数组但没有出现新数组的情况,这真的很奇怪

或者从另一个角度来看,数组可以这样初始化真的很奇怪,但是没有其他集合结构可以这样初始化。它使数组显得特别特殊和重要,尽管它们通常不是适合这项工作的工具

我认为,如果我们必须重新做一遍,可能初始化者会要求在他们的左边有新的[]

是否有技术原因阻止此处的方法调用成为有效语法?也就是说,在解释语法时是否存在一些歧义

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


关于L.B.的另一个答案:虽然这个答案似乎指出了这里存在设计问题,但它忽略了历史的观点。被批评的特性是在C 1.0中创建的,比泛型类型推断C 2.0或其他带括号的集合初始值设定项C 3.0早了几年。因此,我们无法基于与多年后出现的特性的一些冲突来为1.0特性的设计选择进行辩护。C设计团队试图向前看,但他们没有那么向前看

这是有效的:methodnew[]{a,b};假设您有另一个方法void methodKeyValuePair p{},调用哪个方法?请参阅字典的初始化。它不是不一致的。它基于类型推断。然而,在强类型开始崩溃之前,C进行类型推理的程度有一个合理的限制,L.B只是给出了一个很好的例子,说明了在什么情况下可以进行类型推理。是的,类型推理只是在明确的情况下为方便起见而提供的语法糖。@L.B:这些是我一直在寻找的答案。L.B.的回答当然足以排除允许语法的可能性,而且它不是基于观点,而是技术性和事实性的。谢谢因此,L.B.,请输入您的评论作为答案,我将接受。。。。数组可以这样初始化真的很奇怪,但是没有其他集合结构可以这样初始化。与这种类型的初始化不同:新办公室{Employees={Denise,John};其中Employees是在Office构造函数中创建的字符串列表?这种类型的初始化如何调用?@LucaCremonesi:这是一个集合初始化器。我的观点是,你不能说List myList={1,2,3,};但是你可以说int[]myArray={1,2,3};,所以数组是特殊的。为什么数组应该是特殊的而列表不应该是特殊的?特别是,正如您正确地指出的,您可以在对象或集合初始值设定项的上下文中这样做。谢谢。令人遗憾的是,人们不能再问你的答案真正适用的问题,因为它们是意见问题。与你有经验的人的意见是相当有价值的,因此不再认识到这一点是很遗憾的。@DavidI.McIntosh:我在这里很出名,因为我回避了模糊的为什么问题;也就是说,我认为你现在的问题很清楚。关于这方面的更多想法,请参阅有趣的阅读。让我对这个问题和它的演变感觉更好…这是不正确的。初始化synt ax for Dictionary对应于其Add方法的参数,适用于任何集合类型。这是一个错误:KeyValuePair x={0,0};
T x = y;
T x; x = y;