Mi sono imbattuto in quello che per me è stato un risultato inatteso durante il test di un semplice metodo di estensione ForEach
.È possibile che un'azione/un delegato modifichi il suo valore degli argomenti?
ForEach
metodo
public static void ForEach<T>(this IEnumerable<T> list, Action<T> action)
{
if (action == null) throw new ArgumentNullException("action");
foreach (T element in list)
{
action(element);
}
}
Test
metodo
[TestMethod]
public void BasicForEachTest()
{
int[] numbers = new[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
numbers.ForEach(num =>
{
num = 0;
});
Assert.AreEqual(0, numbers.Sum());
}
Perché sarebbe numbers.Sum()
essere uguale a 55 e non 0?
@ 249076: Sì, funzionerebbe. –
Sono d'accordo quello che voglio è un ciclo for, ma come faccio a farlo funzionare in un metodo di estensione se l'argomento è passato per valore quando viene effettuata la chiamata all'azione? Non sembra che ci sia un modo per passare il valore facendo riferimento all'azione delegato che viene passata alla funzione ForEach. Immagino che tutti lo sappiano, ma non mi sono reso conto che foreach (int num in numbers) {num = 0; } non funzionerebbe Perché Num è una copia temporanea e non un riferimento? Pensavo che foreach fosse solo zucchero sintattico per "for". Credo di aver bisogno di smettere di fare tante ipotesi. – 249076
Mi piacerebbe capire un modo per scrivere l'estensione ForEach in modo che possa modificare il valore di un int. Non credo che abbia senso, ma è un enigma che vorrei risolvere. – 249076