4
 Fruit[] data = new[] {
                new Fruit {Name = "Gala",Type = "Apple",Price = 0.75m,Quantity = 10}, 
                new Fruit {Name = "Granny Smith",Type = "Apple",Price = 0.80m,Quantity = 7},
                new Fruit {Name = "Tasty",Type = "Strawberries",Price = 1.90m,Quantity = 20}
                       };

 var grouped = from fruit in data
                          group fruit by fruit.Type;

grouped类型是:System.Linq.GroupedEnumerable<ConsoleApplication15.Fruit,string,ConsoleApplication15.Fruit>

看看它:在此处输入图像描述

我的问题 :

如果分组包含项目(实现 ienumerable) - 为什么它的类型是GroupedEnumerable

不是

IEnumerable <System.Linq.IGrouping<string,ConsoleApplication15.Fruit>>

他们为什么要创建一个新的 Type aka GroupedEnumerable

4

1 回答 1

8

如果您在.Net 中有一个对象,它必须是某种具体类型,它不能是接口。因此,例如,new IList<int>()无效,您必须执行类似new List<int>().

如果你有一个变量,它的类型可以是一个接口,所以你可以写,例如,IList<int> list = new List<int>()

这正是这里发生的事情。变量 的类型groupedIEnumerable<IGrouping<string,Fruit>>(尽管从代码中不清楚,因为您使用的是var)。该变量引用的对象的类型是GroupedEnumerable<Fruit, string, Fruit>,它是 的实现使用的内部类型GroupBy()。不可能IEnumerable,因为您不能拥有接口的实例。

Visual Studio 调试器向您显示对象的运行时类型,因为这就是调试器的用途:向您显示运行时信息。

于 2012-05-05T12:44:59.457 回答