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 type is : System.Linq.GroupedEnumerable<ConsoleApplication15.Fruit,string,ConsoleApplication15.Fruit>
have a look on it : 
my question :
if grouped contains items ( implements ienumerable ) - why its type is GroupedEnumerable
and not
IEnumerable <System.Linq.IGrouping<string,ConsoleApplication15.Fruit>>
why did they create a new Type aka GroupedEnumerable ?
If you have an object in .Net, it has to be of some concrete type, it can't be an interface. So, for example, new IList<int>() is not valid, you have to do something like new List<int>().
If you have a variable, its type can be an interface, so you can write, for example, IList<int> list = new List<int>().
And that's exactly what's happening here. The type of the variable grouped is IEnumerable<IGrouping<string,Fruit>> (although it's not clear from the code, because you're using var). The type of the object referenced by that variable is GroupedEnumerable<Fruit, string, Fruit>, which is an internal type used by the implementation of GroupBy(). It can't be IEnumerable, because you can't have an instance of an interface.
The Visual Studio debugger is showing you the runtime type of the object, because that's what debugger is for: to show you the runtime information.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With