Tôi gặp phải kết quả không mong đợi khi thử nghiệm phương thức mở rộng đơn giản ForEach
.Hành động/đại biểu có thể thay đổi giá trị đối số của nó không?
ForEach
phương pháp
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
phương pháp
[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());
}
Tại sao numbers.Sum()
tính bằng 55 và không phải 0?
@ 249076: Có điều này sẽ hiệu quả. –
Tôi đồng ý những gì tôi muốn là một vòng lặp for, nhưng làm thế nào tôi sẽ làm cho nó hoạt động trong một phương pháp mở rộng nếu đối số được thông qua bởi giá trị khi gọi hành động được thực hiện? Dường như không có cách nào để chuyển giá trị bằng cách tham chiếu đến ủy nhiệm tác vụ được chuyển tới hàm ForEach. Tôi đoán mọi người đều biết điều đó, nhưng tôi đã không nhận ra rằng foreach (int num in numbers) {num = 0; } Sẽ không làm việc. Tại sao lại là một bản sao tạm thời và không phải là một tham chiếu? Tôi cho rằng foreach chỉ là cú pháp cú pháp cho "for". Tôi đoán tôi cần phải ngừng đưa ra rất nhiều giả định. – 249076
Tôi muốn tìm ra một số cách để viết rằng phần mở rộng ForEach để nó có thể thay đổi giá trị của một int. Tôi không đoán điều đó có ý nghĩa, nhưng đó là một câu đố tôi muốn giải quyết. – 249076