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

本文关键字:初始化 语法 数组 调用 方法 | 更新日期: 2023-09-27 18:02:40

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

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

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

看起来其他人都在关注解决方法(这只是指定您需要一个new [] { "some", "strings" })。原因就不那么明显了。

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

后者会有一些问题。在这种情况下,这似乎微不足道,因为从理论上讲,编译器应该能够找出您需要一个string[]。想想有Func<IEnumerable<string>>的情况。在这种情况下会生成什么类型?编译器会胡乱猜测吗?总是使用数组(即使可能有一个更好的适合)?这可能是多种可能性之一。

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

您需要传入一个值作为参数。{"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"}

或者事先创建一个对象并传入。

至于为什么是这样的,您需要传入一个值,而不是用于数组初始化的helper。

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

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

上面的形式你试图传递一个对象没有实例化,即它不存在于你的"上下文"。正确的做法是将其初始化为在引用内存中生成此值,因此可以使用"Func"方法。

在变量声明的情况下:

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

在这种情况下,你的编译器读取:

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

它单独完成这种解释,而不需要您显式地进行对象初始化。

所以我的答案是最好的这种情况下,你必须首先创建对象,然后把它作为一个参数传递给方法:

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