Я собираюсь пойти дальше и сказать, что это может быть ошибкой ( ed: или, по крайней мере, несоответствие ) в реализации. Reflector показывает именно то, что вы видите, что любая другая явная реализация вызывает блокировку для данного SyncRoot
, за исключением IEnumerable.GetEnumerator()
.
Возможно, вам следует отправить заявку на Microsoft Connect .
Я считаю, что причина, по которой неявный метод GetEnumerator()
вызывает lock
, заключается в том, что List<T>.GetEnumerator()
создает новый Enumerator<T>
, который опирается на приватное поле _version
в списке. Хотя я согласен с другими авторами, что я не вижу смысла в блокировке вызова GetEnumerator()
, но, поскольку конструктор Enumerator<T>
опирается на не поточнобезопасные поля, имеет смысл блокировать. Или, по крайней мере, оставаться в согласии с неявными реализациями.