Bonjour,
désolé pour le titre, je me suis inspiré de ce qui ce fait de mieux sur le net (mettez un pouce bleu et lachez des com )
Je sais bien que les IEnumerable sont "exécutés" à l'utilisation, mais là j'ai un collègue qui a un cas vraiment étrange, et je veux bien l'éclaircissement du comment du pourquoi
reproduit avec le code simplifié suivant :
sachant qu'on a gratté un peu on a trouvé d'où ca venait
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 public Form1() { InitializeComponent(); var lb = Test(); var s = lb.ToList()[0].prop1; // fin du test, s contient "test" au lieu de contenir "test changé" } internal IEnumerable<B> Test() { List<A> la = new List<A>(); la.Add(new A() { prop1 = "test" }); IEnumerable<B> lb = la.Select(a => transform(a)); lb.ToList().ForEach(b => b.prop1 += " changé"); return lb; } private B transform(A a) { return new B(a.prop1); } internal class A { public string prop1 { get; set; } } internal class B { public B(string s) { this.prop1 = s; } public string prop1 { get; set; } }
tout se passe ici, en déplacant le .ToList une ligne au dessus prop1 contiendra bien "test changé"
List<B> lb = la.Select(a => transform(a)).ToList;
lb.ForEach(b => b.prop1 += " changé");
alors qu'on a mis un point d'arrêt dans le set de prop1, on y passe bien, la variable privée est bien settée, mais en sortie on avait pas la bonne valeur ...
(VS2015 fx 4.6.1)
ca me parait être plus un bug, donc je veux bien l'explication si c'est une feature ^^
merci.
Partager