new []和new string []有什么区别?

时间:2013-01-15 15:32:56

标签: c# arrays semantics

  

可能重复:
  What is this new[] a shorthand for?

之间有什么区别吗?
var strings = new string[] { "hello", "world" };

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

6 个答案:

答案 0 :(得分:29)

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

请参阅Implicitly typed arrays

答案 1 :(得分:7)

没有区别。

第二个是一个名为"Implicitly typed arrays"的语法糖,两个表达式都返回一个字符串数组。

如果未指定数组的类型,则从用于初始化数组的元素类型中推断
要允许推理,表达式必须满足以下条件:

考虑一个隐式类型化的数组表达式,如下所示:

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

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

   S = {T1, ..., Tn}

允许推理(即没有编译器错误)必须可以将所有类型 { T1, ... , Tn } 隐式地转换为集合中的一个类型 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 } };

答案 2 :(得分:6)

在这种情况下, 没有区别 。由于helloworldstring;

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

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

enter image description here

第二个叫做 Implicitly Typed Arrays

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

答案 3 :(得分:2)

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

就像使用var一样,编译器会处理你的意思。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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