Zgodnie z moją wiedzą this
w metodzie rozszerzenia jest przekazywana jako zmienna ref
. Mogę to sprawdzić wykonującMetoda rozszerzenia i lokalna zmienna "ta"
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();
My List<int> ints
jest teraz 1, 2, 3, 4, 5, 0
.
Jednak kiedy robię
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);
spodziewałbym mój List<int> ints
być 3, 4, 5
ale pozostaje nietknięty. Czy brakuje mi czegoś oczywistego?
'list' nie są przekazywane przez referencję, jest to odniesienie przekazywane przez wartość. Przekazywanie przez odniesienie powoduje aliasy zmiennej w metodzie wywołania wewnątrz osoby, która pozwala na przypisanie jej bezpośrednio. – Lee
Istnieje różnica między "przekazywaniem * przez * odniesienia" i "przekazywaniem * a * odniesienia". Odniesienie do listy jest przekazywane wartością, co oznacza, że możesz uzyskać dostęp do listy i ją modyfikować, ale nie dotykasz zmiennej na zewnątrz, która również odwołuje się do listy. –
'(nowa lista()). Metoda()' compiles => argument nie musi być zmienną w ogóle => nie lubić 'ref'. –