为什么创建类型"IEnumerable<MyClass> myVar"变量不需要 NEW 关键字?



如果我们编写了一个名为MyClass的类,并且需要一个与它的类型相同的对象,我们将进入

var myVar = new MyClass();

,如果我们的MyClass有一个IEnumerable接口,我们再次需要new关键字,如:

class myClass : IEnumerable {...}
var myVar = new MyClass();

如果我们的类MyClass不是用作一个,而是用作类型来实例化一个新变量,例如:

IEnumerable<MyClass> myVar;

我想说我们应该得到一个错误如果我们进入

IEnumerable<MyClass> myVar = new IEnumerable<MyClass>(); 

,但试图理解这背后的逻辑。在这种情况下,如何创建对象的枚举集?

声明一个变量和实例化一个对象是有区别的。

IEnumerable<MyClass> myVar; 

只是声明了一个变量。没有发生实例化。如果使用调试器将鼠标悬停在该变量上,则该变量将为空。这一行也是有效的:

MyClass myVar;

您仍然需要用派生类型实例化IEnumerable来使用它:

IEnumerable<MyClass> myVar = new List<MyClass>(); 

请注意,您的代码行将无法编译,因为您无法实例化接口或抽象类。

IEnumerable<MyClass> myVar = new IEnumerable<MyClass>();  //Does not compile!

你似乎也对IEnumerable<MyClass>中的MyClass感到困惑。这只是一个泛型类型参数,同样,没有任何实例化。

表示返回值,下面的代码完全有效:

IEnumerable<MyClass> myVar = someFunction();
myVar = new List<MyClass>();

然而,someFunction需要实例化(或通过LINQ生成)一个从IEnumerable派生的类,否则这将再次赋值null。我不确定你所说的"在一步中实例化和分配值"是什么意思,所以很难说:)。函数只是模块化代码,没有什么魔力。要返回一个有效值,它首先必须有一个有效值,否则它自己就必须有一个有效值。

IEnumerable是一个接口,你不能实例化它。你必须使用像List这样的具体类。

最新更新