Насколько мне известно, this
в методе расширения передается как переменная ref
. Я могу проверить это, выполнив
public static void Method<T>(this List<T> list)
{
list.Add(default(T));
}
List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method();
Моему List<int> ints
сейчас 1, 2, 3, 4, 5, 0
.
Однако, когда я делаю
public static void Method<T>(this List<T> list, Func<T, bool> predicate)
{
list = list.Where(predicate).ToList();
}
List<int> ints = new List<int>(new int[] { 1, 2, 3, 4, 5 });
ints.Method(i => i > 2);
Я ожидаю, что мой List<int> ints
будет 3, 4, 5
, но останется нетронутым. Я упускаю что-то очевидное?
list
не передается по ссылке, это ссылка, передаваемая по значению. Передача по ссылке создает псевдоним переменной в вызывающем методе внутри вызываемого объекта, что позволяет вам назначать ее напрямую. - person Lee   schedule 10.10.2015(new List<int>()).Method()
компилируется => аргумент вообще не должен быть переменной => не так, какref
. - person Tom Blodget   schedule 11.10.2015