我想知道为什么你可以在C#中做到这一点:
IEnumerable<int>[] nums = new IEnumerable<int>[10];
但不能这样做:
IEnumerable<int> nums = new IEnumerable<int>();
C#在第一个声明的基础上做了什么?我以为你无法使用new关键字创建接口实例。
答案 0 :(得分:12)
您是正确的,因为您无法在C#中创建接口实例。这两个陈述之间的区别在于,在第一个语句中,您创建了bash
的数组,这是允许的。
如果您创建实现IEnumerable<int>
接口的类的实例(例如IEnumerable<T>
),则第二个语句将起作用。
这样做的一个例子是:List<T>
;
你也可以这样做:IEnumerable<int> numbers = new List<int> {1,2,3};
答案 1 :(得分: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};