可能重复:
这个 new[] 的简写是什么?
有没有区别
var strings = new string[] { "hello", "world" };
和
var strings2 = new[] { "hello", "world" };
可能重复:
这个 new[] 的简写是什么?
有没有区别
var strings = new string[] { "hello", "world" };
和
var strings2 = new[] { "hello", "world" };
在这种情况下,没有区别,因为new[]
将提供的值类型推断为string
.
请参阅隐式类型数组。
没有不同。
第二个是称为“隐式类型数组”的语法糖,两个表达式都返回一个字符串数组。
当您不指定数组的类型时,它是从用于初始化数组的元素的类型中推断出来的。
为了允许推理,表达式必须满足以下条件:
考虑像这样的隐式类型数组表达式:
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 } };
在这种情况下,没有区别。因为hello
和world
是string
;
var strings2 = new[] { "hello", "world" };
创建一个string[]
与第一个相同的数组。
第二个被称为Implicitly Typed Arrays
如果我们更进一步,它们具有相同的IL
代码。
无,编译将其解释为new string[] { "hello", "world" };
就像 using 一样var
,编译器会处理您的意思。
new[] 创建一个隐式类型数组,其中类型是从元素中推断出来的。而另一种方法创建一个字符串数组。
没有区别。在第二种情况下,C# 编译器足够聪明地推断出数组的类型,因为它看到用于初始化数组的值是字符串类型的。