通过另一个线程将局部变量修改为null,这怎么可能

meh*_*dvd 6 c# multithreading plinq task-parallel-library

当我正在研究框架的并行性时,我遇到了一个奇怪的情况,我无法想象为什么!我简化了情况来描述它很容易.考虑这段代码:

foreach(var person in personList)
{
    if (person.Name == "Mehran")
        break;
}
Run Code Online (Sandbox Code Playgroud)

其中personList在多个线程之间共享.

在什么情况下是有可能的personnull,我得到NullReferenceExceptionperson.Name

据我所知,这个人在这里被视为局部变量,如果我们进入foreach块,所以我们已personList成功迭代,所以person在任何情况下或任何并行场景都不应为null.

即使personList由另一个线程更改,或者引用person被处置,该person变量也应该具有值.因为没有人可以更改person引用的位置.

是否有任何情况可以解释这种情况?

Jon*_*eet 11

据我所知,这个人在这里被认为是一个局部变量,如果我们进入foreach块,所以我们已经成功迭代了personList,所以在任何情况下或任何并行场景中人都不应该为null.

仅仅因为你personList成功迭代并不意味着它不包含任何空值.例如:

List<Person> personList = new List<Person>();
personList.Add(null);

foreach (var person in personList)
{
   // Here, person will be null
}
Run Code Online (Sandbox Code Playgroud)

(另外,如果有什么东西在修改列表,你通常会遇到麻烦 - 面对作者而言它们不是线程安全的 - 但我不认为这需要成为问题的一部分.)