为什么结构体内的匿名方法无法访问'this'的实例成员

Eri*_*ura 21 c#

我有一个如下代码:

struct A
{
    void SomeMethod()
    {
        var items = Enumerable.Range(0, 10).Where(i => i == _field);
    }

    int _field;
}
Run Code Online (Sandbox Code Playgroud)

...然后我得到以下编译器错误:

struct A
{
    void SomeMethod()
    {
        var items = Enumerable.Range(0, 10).Where(i => i == _field);
    }

    int _field;
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这里发生了什么.

seh*_*ehe 15

变量由参考捕获(即使它们实际值类型;拳击完成然后).

但是,this在ValueType(struct)中无法装箱,因此无法捕获它.

Eric Lippert有一篇关于捕获ValueTypes的惊喜的文章.让我找到链接


请注意Chris Sinclair的评论:

作为快速修复,您可以将结构存储在本地变量中:A thisA = this; var items = Enumerable.Range(0, 10).Where(i => i == thisA._field);- Chris Sinclair 4分钟前

当心,这创造令人惊讶的情况下事实:认同thisA一样的this.更明确地说,如果你选择将lambda保持更长时间,它将通过引用捕获盒装副本 thisA,而不是SomeMethod被调用的实际实例.