可能是重复问题:
这个 new[] 是什么缩写?
这两者有什么不同吗?
var strings = new string[] { "hello", "world" };
和
var strings2 = new[] { "hello", "world" };
可能是重复问题:
这个 new[] 是什么缩写?
这两者有什么不同吗?
var strings = new string[] { "hello", "world" };
和
var strings2 = new[] { "hello", "world" };
var
关键字时也不需要进行任何转换,我猜这就是你想表达的。=) - J. Steenvar
还是显式声明类型,这只是口味和需要清晰度的程度的问题。^^ - J. Steenvar
时,你不应该真的说它是动态的。与C#的dynamic
不同,var
实际上是强类型的。 - Caleb Jares 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 } };
hello
和 world
都是 string
类型的;var strings2 = new[] { "hello", "world" };
string[]
数组。
第二个只是称为隐式类型数组
如果我们再往前走一步,它们有相同的IL
代码。
.Dump()
到输出中,因为我需要它。=) - J. Steennew[]{"hi","bye"}.Dump();
)已经足够令人满意了。但是,品味总是非常主观的。=) - J. Steen如果没有指定数组类型,编译器会将其解释为new string[] { "hello", "world" }
;
这就像使用var
一样,编译器会处理你的意图。
new[] 创建一个 隐式类型数组,其中类型从元素中推断出来。而另一种方法则创建一个字符串数组。
没有区别。 在第二种情况下,C#编译器足够智能,可以推断出数组的类型,因为它看到用于初始化数组的值是字符串类型。