如果我们编写了一个名为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这样的具体类。