Der Grund ist folgender:
Die Art und Weise, wie Sie den Delegaten deklarieren, verweist direkt auf die ToString
Methode der statischen int-Instanz. Es wird zum Zeitpunkt der Erstellung erfasst.
Wie flindeberg in den Kommentaren unten ausführt, hat jeder Delegierte ein Ziel und eine Methode, die auf dem Ziel ausgeführt werden soll.
In diesem Fall ist die auszuführende ToString
Methode offensichtlich die Methode. Der interessante Teil ist die Instanz, auf der die Methode ausgeführt wird: Es ist die Instanz I
zum Zeitpunkt der Erstellung, was bedeutet, dass der Delegat I
die Instanz nicht verwendet , um sie zu verwenden, sondern den Verweis auf die Instanz selbst speichert.
Später wechseln Sie I
zu einem anderen Wert und weisen ihm im Grunde eine neue Instanz zu. Dies ändert die in Ihrem Delegaten erfasste Instanz nicht auf magische Weise. Warum sollte dies der Fall sein?
Um das erwartete Ergebnis zu erzielen, müssen Sie den Delegaten folgendermaßen ändern:
static Func<string> del = new Func<string>(() => I.ToString());
Auf diese Weise verweist der Delegat auf eine anonyme Methode, die zum Zeitpunkt der Ausführung des Delegaten ToString
auf dem aktuellen Stand ausgeführt wird I
.
In diesem Fall ist die auszuführende Methode eine anonyme Methode, die in der Klasse erstellt wurde, in der der Delegat deklariert ist. Die Instanz ist null, da es sich um eine statische Methode handelt.
Sehen Sie sich den Code an, den der Compiler für die zweite Version des Delegaten generiert:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
Wie Sie sehen können, ist es eine normale Methode, die etwas tut . In unserem Fall wird das Ergebnis des Aufrufs ToString
der aktuellen Instanz von zurückgegeben I
.