В первом примере вы перезаписываете элементы внутри List<T>
. Это изменяет список на месте.
Во втором примере вы создаете новый список и заменяете локальную ссылку list
, которая является параметром, который not передается с использованием ref
, поэтому он не имеет никакого эффекта вне области действия метода. Ваш экземпляр foo
не мутирует в CustomExtension
.
Методы расширения в C# не могут передавать параметр this
с помощью ref
, поэтому вы не можете перезаписать ссылку на экземпляр вызывающего.
Если вы измените метод и сайт вызова на обычный метод с параметром ref
, он будет работать, как ожидалось (но он по-прежнему не изменяет foo
, а заменяет его):
static void CustomExtension(ref IList<int> list)
{
list = new List<int>() { 9, 10, 11 };
}
CustomExtension( ref foo );