Me encontré con lo que era para mí un resultado inesperado al probar un método de extensión simple ForEach
.¿Puede una acción/delegar cambiar el valor de sus argumentos?
ForEach
método
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
método
[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());
}
¿Por qué numbers.Sum()
ser igual a 55 y no es 0?
@ 249076: Sí, esto funcionaría. –
Acepto que lo que quiero es un bucle for, pero ¿cómo lo haría funcionar en un método de extensión si el argumento se pasa por valor cuando se realiza la llamada a la acción? No parece que haya una forma de pasar el valor por referencia al delegado de acción que se pasa a la función ForEach. Supongo que todos lo saben, pero no me di cuenta de que foreach (int num en números) {num = 0; } no funcionaría. ¿Por qué num es una copia temporal y no una referencia? Supuse que foreach era solo azúcar sintáctico para "para". Creo que necesito dejar de hacer tantas suposiciones. – 249076
Me gustaría encontrar una forma de escribir esa extensión ForEach para que pueda cambiar el valor de un int. No creo que tenga sentido, pero es un rompecabezas que me gustaría resolver. – 249076