Cal*_*res 18 c# arrays semantics
可能重复:
这个新的[]是什么简写?
两者之间有什么区别吗?
var strings = new string[] { "hello", "world" };
Run Code Online (Sandbox Code Playgroud)
和
var strings2 = new[] { "hello", "world" };
Run Code Online (Sandbox Code Playgroud)
没有不同.
第二个是一个名为"Implicitly typed arrays"的语法糖,两个表达式都返回一个字符串数组.
如果未指定数组的类型,则可以从用于初始化数组的元素类型推断出数组的类型.
要允许推理,表达式必须满足以下条件:
考虑一个隐式类型的数组表达式,如下所示:
var arr = new []{ obj1, ... , objn }
Run Code Online (Sandbox Code Playgroud)
以及初始化中所有元素类型的集合:
S = {T1, ..., Tn}
Run Code Online (Sandbox Code Playgroud)
为了允许推理(即没有编译器错误),必须可以将所有类型 { T1, ... , Tn } 隐式地转换为集合中的一个类型 S.
因此,例如,给定以下类:
class Base { }
class Derived1 : Base { }
class Derived2 : Base { }
class Derived3
{
public static implicit operator Base(Derived3 m)
{ return null; }
}
Run Code Online (Sandbox Code Playgroud)
此代码编译:
var arr = new []{ new Derived1(), new Derived2(), new Derived3(), new Base()};
Run Code Online (Sandbox Code Playgroud)
而以下不是:
var arr = new []{ new Derived1(), new Derived2(), new Derived3() };
Run Code Online (Sandbox Code Playgroud)
因为在第一种情况下,所有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 } };
Run Code Online (Sandbox Code Playgroud)
在这种情况下,没有区别.由于hello和world是string;
var strings2 = new[] { "hello", "world" };
Run Code Online (Sandbox Code Playgroud)
创建一个string[]与第一个相同的数组.

第二个就叫 Implicitly Typed Arrays
如果我们更进一步,他们有相同的IL代码.