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

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)

xle*_*ier 29

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

请参见隐式类型化数组.

  • @Nickolaus:这里没有演员.该变量仍然是强类型的. (2认同)
  • @Nickolaus也没有任何使用`var`关键字的转换,这是我怀疑你暗示的.=) (2认同)
  • @Nickolaus在提到`var`时你不应该说动态.`var`实际上是强类型的,不像C#的`dynamic`. (2认同)

dig*_*All 7

没有不同.

第二个是一个名为"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)


Son*_*nül 6

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

var strings2 = new[] { "hello", "world" };
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

第二个就叫 Implicitly Typed Arrays

如果我们更进一步,他们有相同的IL代码.