【问题标题】:Array initialization syntax in method call方法调用中的数组初始化语法
【发布时间】:2014-05-09 17:27:57
【问题描述】:

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

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

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

【问题讨论】:

  • 你可以使用new [] {"x", "y", "z"}
  • 我确定这是重复的,但目前找不到。基本答案是“因为语言规范是这样说的”......

标签: c# syntax


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那不回答问题为什么数组初始化器不能单独使用
    • @SergeyBerezovskiy,“因为 c# 语言是这样说的”。有谁知道真正的原因吗?
    • @gunr2171 因为没有考虑、设计、测试、实施和交付该功能。它停在那条线上的某个地方。
    【解决方案3】:

    你可以直接在方法调用里面初始化对象,但是觉得不是很好的做法。

    你使用的地方:

     

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

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

    在变量声明的情况下:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多