【发布时间】:2019-02-04 04:57:13
【问题描述】:
虽然,下面的问题似乎很愚蠢,但它仍然可以帮助其他人。我有返回列表的方法。方法返回类型为 IEnumnerable。 方法:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
public static IEnumerable<Person> GetPersons()
{
List<Person> personList = new List<Person>()
{
new Person() { Age = 10, Name = "Vijay"}
};
return personList;
}
}
现在每当我调用这个方法并检查类型。输出是
System.Collections.Generic.List
因为它是一个列表。我应该能够将项目添加到列表中。但是系统抛出编译错误。 下面是执行部分:
public class Program
{
public static void Main(string[] ar)
{
var personList = Person.GetPersons();
Console.WriteLine(personList.GetType()); //System.Collections.Generic.List
personList.Add(new Person(){Age = 11, Name = "Ajay"}); // Compilation error
Console.ReadKey();
}
}
所以任何人都可以帮助我理解。这将是很大的帮助。 提前致谢。
【问题讨论】:
-
看看How can I add an item to a IEnumerable<T> collection?....它可能会帮助你理解。
-
将
IEnumerable视为底层类型(即列表)之上的掩码。我的意思是物理面具(如达斯维德的面具)。可枚举的 itself 知道它是什么(即它知道它是一个列表)。但是它的 caller / user 没有。所以调用者/用户只能使用 all ienumerables 可用的方法与 ienumerable 交互。为什么编译器会这样工作?好吧,仅仅因为面具后面的东西是今天List并不意味着它永远都是。明天,实现可能会改变——它可能是一个数组(不支持Add)。 -
但是每当调用者调用方法并获取方法的类型时。它仍然显示为 System.Collections.Generic.List
。你能解释为什么 GetType 显示为 List -
因为你在问对象它到底是什么。在运行时,它知道面具下是什么(就像如果你戴上达斯维德面具并且有人问你的名字 - 你知道你的名字,但与你交谈的人不知道,除非你告诉他们——这基本上就是
GetType正在做的事情)。但是编译器不知道在 编译时 - 它看到的只是掩码(可能是你在掩码中,或者我 - 它无法区分)。 -
您遇到的问题与dotnetfiddle.net/ol898U 显示的问题基本相同。请注意,您和我都知道
bob是string- 但编译器不知道(它认为类型是object,因为这是变量的类型)。所以它不会让我使用bob.Length,因为object没有Length属性。这与您所看到的基本相同(除了string类似于List和object类似于IEnumerable)。但是,就像IEnumerable一样,如果您调用bob.GetType(),它将返回string。
标签: c# generics collections