【问题标题】:Implicitly typed arrays: why we can't set array size explicitly?隐式类型数组:为什么我们不能显式设置数组大小?
【发布时间】:2013-01-30 14:52:02
【问题描述】:

C# 语言规范 (7.6.10.4) 说,有树种的数组创建表达式:

新的非数组类型 [ 表达式列表 ] rank-specifiersopt array-initializeropt
新的数组类型数组初始化器
新的秩说明符数组初始化器

第三个用于隐式类型数组:

var foo = new[] { 1, 2, 3 };

问题:在隐式类型数组的情况下,是否有任何重要的理由禁止显式设置数组大小?

与以下语法相比,它看起来像不对称行为:

var foo = new int[3] { 1, 2, 3 };

更新

稍微澄清一下。我可以看到,显式设置数组大小和数组初始值设定项组合的唯一优点是在编译时检查初始值设定项长度。如果我声明了三个ints 的数组,则初始化程序必须包含三个ints。

我认为,隐式类型数组也有同样的优势。当然,使用或不使用这个优势是个人喜好。

【问题讨论】:

  • +1。我必须承认..我什至从来没有注意到这一点(我每次都是第一种方式..)。
  • 您正在讨论匿名数组初始化。如果我理解你,你是在问匿名数组是否可以定义得更“紧凑”。我怀疑它们可能是这样设计的,但我没有看到任何明显的优势。这就像在沙子上画一条线。微软开发人员必须在某个地方绘制它。为什么不在那里?
  • 允许这样做有什么意义?
  • @BrianRasmussen:对于显式类型的数组允许这样做有什么意义?我认为,要点是相同的 - 如果我声明必须有 3 个元素,则初始化程序 必须 包含 3 个元素。
  • @Dennis,虽然我认为这更像是一个哲学观点,但它是一个很好的 +1

标签: c#


【解决方案1】:

【讨论】:

  • 我认为他意识到了这一点。问题似乎是,为什么用这种方式而不是那种方式?可以说,OP 可以定义固定大小的匿名数组。我要说的是,所有方法都是同样合理的,只要它们的含义和形式是一致的。
  • @DaveA:完全正确。就个人而言,如果有初始化程序,我从不设置数组长度。但是,如果允许显式类型的数组,我看不出有任何理由禁止它用于隐式类型。
  • @Dennis,微软只是这样设计的,如果你把RANK和项目一起提到编译器在编译时将如何检查?
  • @Anandkumar:检查显式类型数组的方式相同。我看不出有什么矛盾。 :)
【解决方案2】:

我认为这里的一个区别是,这种语法可以看作是首先创建一个类型化数组,然后填充它:

var foo = new int[3] { 1, 2, 3 };

这类似于我们可以在单个语句中声明和初始化其他数据类型的方式:

var list = new List<string>{ "a", "b", "c" };
var dict = new Dictionary<string, string>{ {"a", "b"}, {"c", "d"} };

第一条语句创建和int[3] 并填充它。第二个和第三个语句创建一个List&lt;string&gt;Dictionary&lt;string, string&gt; 并填充它们。

但如果你这样做:

var foo = new[3] { 1, 2, 3 };

这不是一回事。没有像 [3] 这样的数据类型,因此与其他 2 个示例不同,这不是首先创建特定对象并填充它的情况。这是一种用于创建隐式类型数组的特殊语法,其中数组及其内容是从大括号的内容中推断出来的,然后被创建。

我不知道为什么这种语法不应该存在,但我认为这是对你所看到的不对称的合理解释。

【讨论】:

  • > 这不是首先创建一个对象并填充它的情况——我明白你的意思,但我不能同意。类型推断意味着仅类型由编译器推断,而不是由程序员显式设置。这并不意味着编译器会发出一个 IL,它会创建一个未知类型的对象。如果您查看发出的 IL,您会看到具体类型。
  • 是的,没错,但我的意思是它们是两种不同类型的语法。通常情况下,涉及推理的语法模式不允许您在任何您选择的地方插入约束。例如,您可以定义一个具体方法string F(string a){ return a; } 并将F 传递给一个使用Func&lt;string, string&gt; 的方法G,使用G(F),但您不能这样做:G(string (string st) =&gt; return st;) 如果您想绝对确定匿名函数体中的 st 和返回值是字符串。我认为这是一个类似的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
相关资源
最近更新 更多