Linq List.Contains(x => ...) - CS0103 x 在当前上下文中不存在(在 foreach 中)

Linq List.Contains(x => ...) - CS0103 x does not exist in the current context (within foreach)

提问人:ExternalUse 提问时间:1/7/2019 最后编辑:ExternalUse 更新时间:2/7/2021 访问量:1446

问:

我有两个简单的列表,我正在尝试同步。 包含一堆 Guid。 包含许多对象,这些对象具有 (除其他外) Guid 的 ID 属性。此列表由实体框架跟踪,因此我想为 untrackedList 中尚未在 trackedList 中存在的项添加新项,并从 trackedList 中删除未跟踪列表中不存在的所有内容。List<Guid> untrackedListList<Foo> trackedListFoo

public void MyTestMethod()
{
    const int someThing = 1000;
    var untrackedList = new List<Guid>()
    {
        new Guid("8fcfb512-ca00-4463-b98a-ac890b3ac4da"),
        new Guid("6532b60b-f047-4a96-9e5f-c5a242f9a1f5"),
        new Guid("103cb7e4-1674-490c-b299-4b20d90e706c"),
        new Guid("6c933cce-fb0e-4e1b-bbc3-e62235933cc8")
    };
    var trackedList = new List<Foo>()
    {
        new Foo() { SomeId = new Guid("6532b60b-f047-4a96-9e5f-c5a242f9a1f5"), Something = someThing },
        new Foo() { SomeId = new Guid("12345678-abcd-1234-1234-1234567890ab"), Something = someThing }
    };
    // testing Find and Exists
    var testFind = trackedList.Find(x => x.SomeId == new Guid("6532b60b-f047-4a96-9e5f-c5a242f9a1f5")); // finds one Foo
    var testExists = trackedList.Exists(x => x.SomeId == new Guid("12345678-abcd-1234-1234-1234567890ab")); // == true

    foreach (var guid in untrackedList)
    {
        // add all items not yet in tracked List
        if (!trackedList.Exists(x => x.SomeId == guid))
        {
            trackedList.Add(new Foo() { SomeId = guid, Something = someThing });
        }
    }
    // now remove all from trackedList that are not also in untracked List (should remove 12345678-...)
    trackedList.RemoveAll(x=> !untrackedList.Contains(x.SomeId)); // successful, but also shows CS0103 in the debugger
}

这可能不是最有效的方法,但它似乎有效。但是,当通过调试器运行它时,我被错误 CS0103“名称'x'在当前上下文中不存在”抛出Debugger Screenshot

是什么原因导致了此错误?为什么它不会导致异常?

调试器中的 显示了相同的错误。RemoveAll 方法(最后一行)。

c#

评论

1赞 Lee 1/7/2019
看起来您将鼠标悬停在属性上 - 无法计算该属性,因为此时未绑定。SomeIdx
1赞 Bola 1/7/2019
我已经测试了代码,它在我的机器上运行良好。可能是李说的
0赞 TanvirArjel 1/7/2019
我还在我的机器中测试了此代码,并按预期工作!
1赞 ExternalUse 1/7/2019
感谢大家抽出宝贵时间测试并确认它是否有效。@Lee可能是正确的;虽然我没有鼠标,但我怀疑 ReSharper 可能会持续评估 - 可能在它没有绑定的时候。再次感谢大家!
1赞 ExternalUse 1/7/2019
@MarioMitterbauer 对不起,这是构建简化示例时的疏忽。我将修改问题以反映这一点。

答:

0赞 Or Cohen 2/7/2021 #1

这很简单,通常当变量不是作用域并且无法计算时会发生错误,也就是说,如果编译器尝试计算 x,x 并没有真正在方法 MyTestMethod 的范围内计算,有一个从查询构建的表达式并在不同的范围内计算,因为 x 是表达式的一部分,它是在不同的范围内计算的。

评论

1赞 DuDa 2/7/2021
谢谢你的努力。建议:请在语法和结构上完善您的答案。你的答案是一句话,四行......