La raison en est la suivante:
La façon dont vous déclarez le délégué qu'il pointe directement vers l' ToString
méthode de la static int instance. Il est capturé au moment de la création.
Comme flindeberg points dans les commentaires ci-dessous, chaque délégué a un objectif et une méthode pour être exécuté sur la cible.
Dans ce cas, la méthode à exécuter est évidemment l' ToString
méthode. La partie intéressante est l'instance de l'exécution de la méthode: C'est l'instance d' I
au moment de la création, ce qui signifie que le délégué n'est pas à l'aide de I
pour obtenir l'instance à utiliser, mais il stocke la référence à l'instance elle-même.
Plus tard vous changez I
à une valeur différente, fondamentalement affecter une nouvelle instance. Ce n'est pas comme par magie modifier l'instance saisi dans votre délégué, pourquoi devrait-il?
Pour obtenir le résultat que vous attendez, vous devrez modifier le délégué à ceci:
static Func<string> del = new Func<string>(() => I.ToString());
Comme cela, le délégué des points à une méthode anonyme qui s'exécute ToString
sur le courant I
au moment de l'exécution de la délégation.
Dans ce cas, la méthode à exécuter est une méthode anonyme créée dans la classe dans laquelle le délégué est déclarée. L'exemple est nul car c'est une méthode statique.
Regardez le code, le compilateur génère pour la deuxième version du délégué:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
Comme vous pouvez le voir, c'est une méthode normale qui n' quelque chose. Dans notre cas, elle renvoie le résultat de l'appel d' ToString
sur l'instance en cours d' I
.