实例化没有语言语法的新数组[]

时间:2012-05-31 16:40:32

标签: c# .net arrays

在C#中,可以使用特殊的方括号语法new int[3]实例化一个数组。这与通过调用构造函数new List<int>()实例化的其他类型不同。你能用普通的语法创建一个数组吗?

我尝试了new System.Array<int>(3),但它爆炸了

  

非泛型类型'System.Array'不能与类型参数一起使用

3 个答案:

答案 0 :(得分:8)

System.Array本身是抽象的,因此您将无法使用其构造函数对其进行实例化。正如你的错误所证明的那样,它实际上也不是通用的;它只能通过implementing generic collection interfaces at runtime获取其类型(另请参阅this related answer):

  

重要

     

在.NET Framework 2.0版中,Array类实现System.Collections.Generic.IList<T>System.Collections.Generic.ICollection<T>System.Collections.Generic.IEnumerable<T>通用接口。这些实现在运行时提供给数组,因此文档构建工具不可见。

由于上述原因,System.Array类提供了一种称为CreateInstance()的便捷方法,您可以使用它:

var array = Array.CreateInstance(typeof(int), 3);
  

说明

     

与大多数类不同,Array提供CreateInstance方法,而不是公共构造函数,以允许后期绑定访问。

使用此方法时要非常小心,因为结果array 在编译时强类型化!如果你希望它是强类型的,你必须在创建它之后强制它(不,只是声明int[] array是不够的):

var array = (int[]) Array.CreateInstance(typeof(int), 3);

答案 1 :(得分:1)

创建数组没有“普通”构造函数语法。您唯一的选择是数组构造函数语法new type[length]以及CreateInstance类的各种静态Array方法。请注意,后者是使用返回类型Array定义的,需要先将其转换为实际的数组类型。

BTW:Array.CreateInstance还允许您创建基于非零的数组,否则C#无法使用这些数组。但请记住,几乎没有人希望数组和其他IList实现的下限不是零。

答案 2 :(得分:-2)

如果要在实例化数组时指定值,也可以在c#中使用以下内容。

predefinedIntArrayVariable = new int [] {x,y,z};