我想知道为什么你可以在C#中这样做:
IEnumerable<int>[] nums = new IEnumerable<int>[10];
但是不能这样做:
IEnumerable<int> nums = new IEnumerable<int>();
第一个语句在幕后做了什么?我以为你不能使用new关键字创建接口的实例。
我想知道为什么你可以在C#中这样做:
IEnumerable<int>[] nums = new IEnumerable<int>[10];
但是不能这样做:
IEnumerable<int> nums = new IEnumerable<int>();
第一个语句在幕后做了什么?我以为你不能使用new关键字创建接口的实例。
你是正确的,C#中无法创建接口的实例。两种语句的区别在于,在第一种语句中,你正在创建一个IEnumerable<int>
数组,这是允许的。
如果您创建实现IEnumerable<T>
接口的类的实例,例如List<T>
,则第二个语句将起作用。
这样做的一个示例是:IEnumerable<int> numbers = new List<int> {1,2,3};
;
您还可以执行以下操作:IEnumerable<int> numbers = new int[] {1, 2, 3}
int[]
数组有什么不同呢?IEnumerable<int>
部分实际上是在做什么?我以为你只能使用接口作为类型来“持有”实现 IEnumerable
的对象。例如,如果我只关心迭代它,我可以在 IEnumerable<int>
中“持有”一个 List<int>
。IEnumerable<int>
是否只是与 int[]
数组相同,除了无法访问特定索引处的元素之外? - GabeMeisterIEnumerable<T>
是集合和数组实现的基本接口。这就是为什么你可以这样做:IEnumerable<int> numbers = new int[] {1, 2, 3};
如果你只想遍历一个集合,我建议你使用IEnumerable<T>
。这允许调用代码使用几种不同的IEnumerable<T>
实现。有关IEnumerable<T>
的更多信息,请参阅:https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.110).aspx - Joakim Skoog第一个语句创建了一个大小为10的新数组,其中项类型为IEnumerable<int>
。该数组本身是一个具体类型,可以创建。
要设置此数组中的项目,您需要执行以下操作:
num[0] = new List<int>() {1,2,3};
IEnumerable<int>
,但您不能创建 IEnumerable<int>
的实例。您需要创建一个实现 IEnumerable<int>
的类的实例,例如 List<int>
。IEnumerable<int>
的实例,即不是类,因此它将无法编译。IEnumerable<int>
,但您需要创建一个实现 IEnumerable<int>
的类的实例,如下所示:IEnumerable<int> nums = new List<int>() {1,2,3};