C# IEnumerable<;对象>;a=新的IEnumerable<;对象>;(); 我能做这个吗?

C# IEnumerable<;对象>;a=新的IEnumerable<;对象>;(); 我能做这个吗?,c#,C#,我想创建一个对象的新实例IEnumerable 我能做这个吗 IEnumerable<object> a = new IEnumerable<object>(); IEnumerable a=新的IEnumerable(); 例如,您可以创建列表的实例,该实例实现了IEnumerable。例如: List<object> list = new List<object>(); list.Add(1); list.Add(4); list.Add(5

我想创建一个对象的新实例
IEnumerable

我能做这个吗

IEnumerable<object> a = new IEnumerable<object>();
IEnumerable a=新的IEnumerable();

例如,您可以创建
列表的实例,该实例实现了
IEnumerable
。例如:

List<object> list = new List<object>();
list.Add(1);
list.Add(4);
list.Add(5);

IEnumerable<object> en = list;
CallFunction(en);
List List=新列表();
增加第(1)款;
增加(4);
增加(5);
IEnumerable en=列表;
调用函数(en);

不行,因为
IEnumerable
是一个接口

您应该能够创建大多数实现
IEnumerable
的非接口类型的空实例,例如:-

IEnumerable<object> a = new object[] { };
IEnumerable a=新对象[]{};

IEnumerable a=新列表();

没有IEnumerable是接口,您不能创建接口的实例

你可以这样做

IEnumerable<object> a = new object[0];
IEnumerable a=新对象[0];

既然您现在指定要添加到它,那么您想要的不是一个简单的
IEnumerable
,而是至少一个
ICollection
。我建议简单地使用如下
列表

List<object> myList=new List<object>();
myList.Add(1);
myList.Add(2);
myList.Add(3);
另一种实现
IEnumerable
的常用方法是C#3中引入的:

IEnumerable MyIterator()
{
收益率1;
收益率2;
收益率3;
}
IEnumerable e4=MyIterator();
我想创建一个新的可枚举对象或列表,并能够添加到其中


这个评论改变了一切。无法添加到通用
IEnumerable
。如果您想继续使用
System.Collections.Generic
中的接口,则需要使用实现
ICollection
的类,如
List

:

返回具有指定类型参数的空IEnumerable

IEnumerable a=Enumerable.Empty();
这上面有一条线索:

如果使用空数组或空列表,则这些对象存储在内存中。垃圾收集器必须照顾它们。如果您正在处理一个高吞吐量的应用程序,它可能会产生显著的影响

Enumerable.Empty
不会为每次调用创建对象,从而减少GC的负载


主要原因是我们无法创建接口的对象,而IEnumerable是一个接口。
我们需要创建实现接口的类的对象。这是我们无法直接创建IEnumerable对象的主要原因。

不,您不能这样做。请改用以下代码行:

IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();
IEnumerable usersIds=new List(){1,2,3}.AsEnumerable();
我希望有帮助。

您可以这样做:

IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
IEnumerable list=new list(){1,4,5}.AsEnumerable();
调用函数(列表);

这是一个相当古老的问题,但为了新手的利益,这就是我们如何保护
IEnumerable
免受
空异常的影响。换句话说,创建类型为
IEnumerable

public IEnumerable MyPropertyName{get;set;}=Enumerable.Empty();


干杯。

相关:请澄清您的问题。这行代码无法编译,我相信您已经发现了这一点。如果你能给我们更多关于你真正想要达到的目标的信息,那将有助于我们回答你。@Wingman 20-10:好吧,这改变了一切。无法添加到通用
IEnumerable
。您必须使用类似于
List
的东西。在这种情况下,您需要一个具体的数组List objs=new IEnumerable。无法将项添加到迭代器,因为它不是集合。。。它是一个迭代器:)@ivo:请注意,
IEnumerable
并不表示迭代器-它表示一个iterable序列
IEnumerator
本身表示迭代器。鉴于问题显示了泛型的使用,给定一个未实现泛型
IEnumerable
的类型示例,在我看来是个坏主意。使用CallFunction(list.AsEnumerable())而不是IEnumerable en=list;有任何问题吗;。。。如果可能的话,我会使用带有文字初始值设定项的数组,它是.NET中最有效、最轻量级的可枚举类型,并且没有列表的开销。仅当您确实需要或希望在初始化后进行更改时,才应使用列表。另外,最好在数组或列表中添加System.Linq和invoke.AsEnumerable()。@AdamRalph:我投了反对票,然后分心了,所以不能立即留下评论。接口是类型,所以您的答案是危险的错误,因为它传播了一种常见的误解。有可能创建像@Jon Skeet这样的COM接口实例吗?绝对有可能。奇怪,但却是真的。请参阅,我认为可以指定一个实例化的默认实现,而不是COM接口的接口。@JonSkeet说调用
new SomeComInterface()
实例化接口的关联“CoClass”不是更准确吗而不是实例化接口本身?@phoog:这是正确的-但重要而奇怪的是,在某些情况下,你可以对接口使用
new
。最干净的答案!
IEnumerable<object> e1=new object[]{1,2,3};
IEnumerable<object> e2=new List<object>(){1,2,3};
IEnumerable<object> e3=new ReadOnlyCollection(new object[]{1,2,3});
IEnumerable<object> MyIterator()
{
  yield return 1;
  yield return 2;
  yield return 3;
}

IEnumerable<object> e4=MyIterator();
IEnumerable<object> a = Enumerable.Empty<object>();
IEnumerable<int> usersIds = new List<int>() {1, 2, 3}.AsEnumerable();
IEnumerable<object> list = new List<object>(){1, 4, 5}.AsEnumerable();
CallFunction(list);
public IEnumerable<T> MyPropertyName { get; set; } = Enumerable.Empty<T>();