在C#中实例化一个IEnumerable数组

3

我想知道为什么你可以在C#中这样做:

IEnumerable<int>[] nums = new IEnumerable<int>[10];

但是不能这样做:

IEnumerable<int> nums = new IEnumerable<int>();

第一个语句在幕后做了什么?我以为你不能使用new关键字创建接口的实例。


你认为在哪里创建实例?你在第一条语句中分配了一个类型为IEnumerable<int>的数组。没有创建单个实例。 - TomTom
"C# 的第一条语句在底层做了什么?" 它正在创建一个包含 10 个 IEnumerables 的数组。这不是你要找的。尝试使用 ... num = new int[10]。 - Jonathan Dickinson
2个回答

13

你是正确的,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[] 数组相同,除了无法访问特定索引处的元素之外? - GabeMeister
IEnumerable<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
1
是的,我理解那部分。我想我真正困惑的地方在于我一直认为整数位于每个索引处,而实际上,正如Yacoub Massad指出的那样,在每个索引处都有一个实现IEnumerable的东西。感谢您的解释! - GabeMeister
@GabeMeister:是的,没错。没问题,我很高兴能帮忙! - Joakim Skoog

6

第一个语句创建了一个大小为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};

啊,这就是让我明白了的东西。之前我一直以为每个索引处都有一个整数,但实际上每个索引处都有一个实现IEnumerable接口的东西(如List、ArrayList等)。谢谢! - GabeMeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接