方法调用中的数组初始化语法
本文关键字:初始化 语法 数组 调用 方法 | 更新日期: 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);