之间有什么区别吗?
var strings = new string[] { "hello", "world" };
和
var strings2 = new[] { "hello", "world" };
答案 0 :(得分:29)
在这种情况下,没有区别,因为new[]
会将提供的值类型推断为string
。
答案 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)
在这种情况下, 没有区别 。由于hello
和world
是string
;
var strings2 = new[] { "hello", "world" };
创建一个string[]
数组,与第一个数组相同。
第二个叫做 Implicitly Typed Arrays
如果我们更进一步,它们会有相同的IL
代码。
答案 3 :(得分:2)
无,编译将其解释为new string[] { "hello", "world" };
就像使用var
一样,编译器会处理你的意思。
答案 4 :(得分:1)
new []创建一个implicitly typed array,其中的类型是从元素中推断出来的。而另一种方法创建了一个字符串数组。
答案 5 :(得分:0)
没有区别。 在第二种情况下,C#编译器足够聪明地推断出数组的类型,因为它看到用于初始化数组的值是字符串类型。