J'ai une situation où le code se comporte différemment lorsqu'il est compilé sur deux boîtes de développement différentes. Je ne peux pas comprendre pourquoi. Je ne suis pas sûr que les mots-clés décrivent le mieux ce problème.Fermeture de capture d'expression lorsqu'elle doit référencer l'instance de classe
Quand lapin est appelé à une source de boîte a la valeur
{() => Program.Names}
Sur une autre source de boîte a la valeur
{() => value(NPC.Program+<>c__DisplayClass1_0).Names}
Hole a toujours la valeur, peu importe quel ordinateur il est compilé.
{() => value(NPC.Program+<>c__DisplayClass1_0).closure}
Je suis en train de comprendre pourquoi une machine a l'expression de la classe et l'autre machine a la valeur de la fermeture lors de l'appel de lapin. J'aimerais aussi savoir s'il existe un moyen de contrôler cela. Merci!
class Program
{
public static ObservableCollection<string> Names = new ObservableCollection<string>();
static void Main(string[] args)
{
string closure = "closure";
if(closure.Length > 0)
{
GoingDown(p => {
closure.ToString();
Names = new ObservableCollection<string>();
Rabbit(() => Names);
Hole(() => closure);
}, closure);
}
}
public static void Rabbit<SourceType>(Expression<Func<ObservableCollection<SourceType>>> source)
{
"Testing".ToString();
}
public static void Hole(Expression<Func<object>> source)
{
"Testing".ToString();
}
public static void GoingDown(Action<object> a, object target)
{
Action b =() =>
{
a(target);
};
b();
}
}
Quelles versions de C#, et quel framework .net, sur les deux systèmes? – RBarryYoung