原因如下:
声明委托的方式直接指向ToString
静态int实例的方法。它是在创建时捕获的。
正如flindeberg在下面的评论中指出的那样,每个代表都有一个目标和在该目标上执行的方法。
在这种情况下,要执行的ToString
方法显然是该方法。有趣的部分是在其上执行该方法的实例:它是创建时的实例I
,这意味着委托未使用它I
来获取要使用的实例,而是存储了对该实例本身的引用。
稍后,您将更I
改为其他值,基本上是为其分配一个新实例。这不会神奇地更改您的委托中捕获的实例,为什么要这么做?
为了获得您期望的结果,您需要将委托更改为此:
static Func<string> del = new Func<string>(() => I.ToString());
这样,委托指向执行的匿名方法 ToString
该时在当前I
。
在这种情况下,要执行的方法是在声明委托的类中创建的匿名方法。实例为null,因为它是静态方法。
看一下编译器为委托的第二个版本生成的代码:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
正如你所看到的,它是不正常的方法的东西。在我们的例子中,它返回调用ToString
的当前实例的结果I
。