18

可能重复:
这个 new[] 的简写是什么?

有没有区别

var strings = new string[] { "hello", "world" };

var strings2 = new[] { "hello", "world" };
4

6 回答 6

29

在这种情况下,没有区别,因为new[]将提供的值类型推断为string.

请参阅隐式类型数组

于 2013-01-15T15:34:20.157 回答
7

没有不同。

第二个是称为“隐式类型数组”的语法糖,两个表达式都返回一个字符串数组。

当您不指定数组的类型时,它是从用于初始化数组的元素的类型中推断出来的。
为了允许推理,表达式必须满足以下条件:

考虑像这样的隐式类型数组表达式:

   var arr = new []{ obj1, ... , objn }

初始化中所有元素类型的集合是:

   S = {T1, ..., Tn}

为了允许推理(即没有编译器错误),必须可以将所有类型 { T1, ... , Tn } 隐式转换为 set 中的一种类型 S

因此,例如,给定以下类:

class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
class Derived3
{ 
    public static implicit operator Base(Derived3 m)
    { return null; }
}

此代码编译:

var arr = new []{ new Derived1(), new Derived2(), new Derived3(), new Base()};

而以下没有:

var arr = new []{ new Derived1(), new Derived2(), new Derived3() };

因为在第一种情况下,所有 3 种类型都可以隐式转换为类型Base,并且Base类型在集合内S = { Derived1, Derived2, Derived3, Base },而在第二种情况下,所有类型都不能转换为集合中的一种类型S = { Derived1, Derived2, Derived3 }


此功能已随 C# 3.0 以及匿名类型一起引入,它使后者的数组的实例化更加容易。

例如,如果没有隐式类型的数组,这将很难获得:

var arrayOfAnonymous = new[] { new { A = 3, B = 4 }, new { A = 2, B = 5 } };
于 2013-01-15T15:35:14.397 回答
6

在这种情况下,没有区别。因为helloworldstring;

var strings2 = new[] { "hello", "world" };

创建一个string[]与第一个相同的数组。

在此处输入图像描述

第二个被称为Implicitly Typed Arrays

如果我们更进一步,它们具有相同的IL代码。

于 2013-01-15T15:37:10.307 回答
2

无,编译将其解释为new string[] { "hello", "world" };

就像 using 一样var,编译器会处理您的意思。

于 2013-01-15T15:35:21.067 回答
1

new[] 创建一个隐式类型数组,其中类型是从元素中推断出来的。而另一种方法创建一个字符串数组。

于 2013-01-15T15:34:00.263 回答
0

没有区别。在第二种情况下,C# 编译器足够聪明地推断出数组的类型,因为它看到用于初始化数组的值是字符串类型的。

于 2013-01-15T15:35:11.387 回答