当方法返回类型为IEnumerable时,方法正在返回List。但是GetType显示为List

时间:2019-02-04 04:57:13

标签: c# generics collections

尽管,以下问题似乎很愚蠢,但仍然可以帮助其他人。我有一个返回列表的方法,并且该方法返回的类型为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");
    });

所以有人可以帮助我加深理解。这将是极大的帮助。 预先感谢。

3 个答案:

答案 0 :(得分:1)

IEnumerable Interface

  

公开枚举器,该枚举器支持对   指定类型的集合。

仅此而已。现在,IEnumerable可以使用许多扩展方法,尽管Add并不是其中一种

List<T>,实现了有意义的IEnumerable,并且具有添加的功能。

所以从这里您有2个选择

  1. 返回List<T>

    • public static List<Person> GetPersons()
  2. 将您的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;

    }