作为 Func 参数传递的 `this.SomeMethod` 是否捕获 `this`?

Does `this.SomeMethod` passed as Func argument capture `this`?

如果一个方法要求一些 Func:

void Foo(Func<string> stringFactory);

然后传递一个 lambda 引用 this 引入变量捕获:

Foo(() => this.MagicStringProperty); // Captures `this`

传递实例方法而不是 lambda 时也会发生这种情况吗?

Foo(this.GetMagicString); // Capturing??

string GetMagicString()
{
    return "Bar";
}

如果是,这是否编译为与 lambda 版本类似的东西?

如果不是,它如何设法同时传递方法(存在于某处)和实例(存在于其他地方)?

this 不必在此处的闭包中捕获。调用之间的区别在于有一个编译器为 () => this.MagicStringProperty() 生成的方法。此方法简单地调用 this.GetMagicString().

如果反编译代码,您会看到 Foo(this.GetMagicString) 转换为 this.Foo(new Func<string>((object) this, __methodptr(GetMagicString)))Foo(() => this.GetMagicString()) 转换为 this.Foo(new Func<string>((object) this, __methodptr(<.ctor>b__1_0))),其中 <.ctor>b__1_0 是编译器生成的调用 this.GetMagicString():

的方法
[CompilerGenerated]
private string <.ctor>b__1_0()
{
  return this.GetMagicString();
}