方法调用中的数组初始化语法

时间:2014-05-09 17:27:58

标签: c# syntax

有了下面的代码,为什么变量声明被认为是正确的语法,而不是方法调用?

public static void Func(string[] p)
{
}

public static void Test()
{
    string[] a = { "x", "y", "z" };
    Func({"x", "y", "z"});
}

3 个答案:

答案 0 :(得分:4)

看起来其他人都专注于解决方法(这只是为了指明你需要一个new [] { "some", "strings" }。但为什么有点不太明显。

前者是有​​效的,因为编译器知道使用您的初始化语法来创建一个数组(因为您已经将它定义为这样)。

后者会有一些问题。在这种情况下看起来似乎微不足道,因为从理论上讲,编译器应该能够确定你需要一个string[]。考虑一下你有Func<IEnumerable<string>>的情况。在这种情况下生成什么类型​​?编译器会猜测一下吗?始终使用数组(即使可能更合适)?它可能是众多可能性之一。

我猜这是语言规范不允许以这种方式传递的原因。

答案 1 :(得分:0)

您需要传入一个值作为参数。 {"x", "y", "z"} 一个值。它可以用作初始化变量的简写。

请注意,这两个都有效:

List<string> a = new List<string>() {"x", "y", "z"};
string[] b = new string[] {"x", "y", "z"};

它代表的完整版本:

List<string> a = new List<string>();
a.Add("x");
a.Add("y");
a.Add("z");

所以你需要制作一个对象(new

new [] {"x", "y", "z"}

或事先制作一个物品并传递给它。

至于为什么这是这样的,你需要传入一个值,而不是数组初始化的帮助器。

答案 2 :(得分:0)

您可以直接在方法调用的内部初始化对象,但不要认为是一个好习惯。

您使用过的地方:

Func ({"x", "y", "z"}); 

您尝试传递未实例化的对象的上述表单,即它在您的“上下文”中尚不存在。正确的是你将它初始化为在参考存储器中生成该值,因此可以使用它的“Func”方法。

在变量声明的情况下:

string[] a = {"x", "y", "z"}; 

在这种情况下,您的编译器正在阅读:

string[] a = new string[] {"x", "y", "z"};

它单独执行此解释,无需您明确地进行对象初始化。

所以我的答案最适合这种情况,您必须首先创建对象,然后将其作为参数传递给方法:

  string[] a = {"x", "y", "z"}; 
  Func (s);