A mia conoscenza this
in un metodo di estensione viene passato come variabile ref
. Posso verificare questo facendoMetodo di estensione e variabile locale "this"
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();
mio List<int> ints
è ora 1, 2, 3, 4, 5, 0
.
Tuttavia quando lo faccio
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);
mi aspetto il mio List<int> ints
essere 3, 4, 5
ma rimane intatta. Mi manca qualcosa di ovvio?
'list' non è passato per riferimento, è un riferimento passato per valore. Passando tramite alias di riferimento la variabile nel metodo di chiamata all'interno del callee che consente di assegnarla direttamente. – Lee
C'è una differenza tra "passare * per * riferimento" e "passare * un * riferimento". Il riferimento alla lista viene passato per valore, il che significa che è possibile accedere e modificare l'elenco, ma non si sta toccando la variabile all'esterno che fa anche riferimento alla lista. –
'(nuovo Elenco()). Il metodo()' compiles => argomento non deve essere necessariamente una variabile => non come 'ref'. –