有了下面的代码,为什么变量声明被认为是正确的语法,而不是方法调用?
public static void Func(string[] p)
{
}
public static void Test()
{
string[] a = { "x", "y", "z" };
Func({"x", "y", "z"});
}
答案 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);