Er, not quite sure how to express it, but ..
Given that IEnumerable was created using yield return containing three instances of the class, why does the .First () call seem to return a “copy” of the first instance?
See the following code;
public class Thing { public bool Updated { get; set; } public string Name { get; private set; } public Thing(string name) { Name = name; } public override string ToString() { return string.Format("{0} updated {1} {2}", Name, Updated, GetHashCode()); } } class Program { static void Main(string[] args) { Console.WriteLine("IEnumerable<Thing>"); var enumerableThings = GetThings(); var firstThing = enumerableThings.First(); firstThing.Updated = true; Console.WriteLine("Updated {0}", firstThing); foreach (var t in enumerableThings) Console.WriteLine(t); Console.WriteLine("IList<Thing>"); var thingList = GetThings().ToList(); var thing1 = thingList.First(); thing1.Updated = true; Console.WriteLine("Updated {0}", thing1); foreach (var t in thingList) Console.WriteLine(t); Console.ReadLine(); } private static IEnumerable<Thing> GetThings() { for (int i = 1; i <= 3; i++) { yield return new Thing(string.Format("thing {0}", i)); } } } }
executed this produces the following output:
IEnumerable<Thing> Updated thing 1 updated True 37121646 thing 1 updated False 45592480 thing 2 updated False 57352375 thing 3 updated False 2637164 IList<Thing> Updated thing 1 updated True 41014879 thing 1 updated True 41014879 thing 2 updated False 3888474 thing 3 updated False 25209742
but I would expect that IList and IEnmerable would behave the same and output like this ...
IEnumerable<Thing> Updated thing 1 updated True 45592480 thing 1 updated False 45592480 thing 2 updated False 57352375 thing 3 updated False 2637164 IList<Thing> Updated thing 1 updated True 41014879 thing 1 updated True 41014879 thing 2 updated False 3888474 thing 3 updated False 25209742
What am I missing ?!
source share