尽管,以下问题似乎很愚蠢,但仍然可以帮助其他人。我有一个返回列表的方法,并且该方法返回的类型为IEnumnerable。 方法:
Customer
现在无论何时我调用此方法并检查类型。输出为
Person
因为它是一个列表。我应该能够将项目添加到列表中。但是系统抛出编译错误。 下面是执行部分:
modelBuilder.Entity<Employee>().OwnsOne(p => p.Address,
a =>
{
a.ToTable("EmployeeAddresses");
});
modelBuilder.Entity<Customer>().OwnsOne(p => p.DeliveryAddress,
a =>
{
a.ToTable("DeliveryAddresses");
}).OwnsOne(p => p.InvoicingAddress,
a =>
{
a.ToTable("InvoicingAddresses");
});
所以有人可以帮助我加深理解。这将是极大的帮助。 预先感谢。
答案 0 :(得分:1)
公开枚举器,该枚举器支持对 指定类型的集合。
仅此而已。现在,IEnumerable
可以使用许多扩展方法,尽管Add
并不是其中一种
List<T>
,实现了有意义的IEnumerable
,并且具有添加的功能。
所以从这里您有2个选择
返回List<T>
public static List<Person> GetPersons()
将您的IEnumerable
枚举为List<T>
var personList = Person.GetPersons().ToList();
您应该使用哪个?很好的事实是您试图添加某些内容,而没有枚举它,或者在Linq语句中使用它,这表明您可能应该选择选项1
但是,只要调用方调用该方法并获取其类型 方法。它仍显示为System.Collections.Generic.List。可以 你解释为什么GetType显示为列表
因为这是创建的类型,所以当您返回IEnumerable
时,您只是将List<T>
强制转换为更基本的类型(在本例中为接口)。当您调用 GetType 时,它会告诉您它是什么类型,因为它是 IS 该类型。编译器仍然知道您创建的类型!万一您想将其退回。
我认为您需要再打一些文档
答案 1 :(得分:0)
IEnumerable接口负责遍历集合,而不是继续进行存储和添加/删除。因此,要添加到列表中,您可以将返回类型更改为List<Person>
,如下所示:
public static List<Person> GetPersons()
[...]
一切都会正常工作。
虽然您的return方法确实返回了一个List,但是通过说返回类型是IEnumerable,您对函数的用户说的应该只是迭代而不是更改。这就是为什么您会收到编译错误。
答案 2 :(得分:0)
IEnumerable
不支持向其中添加新元素。
来自MSDN的IEnumberable接口:
公开一个枚举器,该枚举器支持对 非通用集合。
使用IEnumerable<Person>
代替使用GetPerson()
作为List<Person>
函数的返回类型。
像
public static List<Person> GetPersons()
{
List<Person> personList = new List<Person>()
{
new Person() { Age = 10, Name = "Vijay"}
};
return personList;
}