Вы уверены, что этот код вызывает исключение? У меня
using System.Collections.Generic;
class MyObject { }
class Program {
static void Main(string[] args) {
List<MyObject> listOfMyObject = new List<MyObject>();
listOfMyObject.Clear();
}
}
и я не получаю исключения.
Ваш реальный пример более сложный? Возможно, у вас есть несколько потоков, одновременно обращающихся к списку? Можем ли мы увидеть трассировку стека?
List<T>.Clear
действительно довольно просто. Использование отражателя:
public void Clear() {
if (this._size > 0) {
Array.Clear(this._items, 0, this._size);
this._size = 0;
}
this._version++;
}
В случае, если список уже пуст, это никогда не вызовет исключения. Однако, если вы изменяете список в другом потоке, Array.Clear
может вызвать исключение IndexOutOfRangeException
. Таким образом, если другой поток удалит элемент из списка, то this._size
(количество очищаемых элементов) будет слишком большим.