C#:为什么此委托使用参数打印错误的值进行调用

时间:2018-07-20 10:53:52

标签: c# delegates invoke

我创建了一个委托列表,并为变量i的每个值添加了以下匿名委托:

delegate {Console.WriteLine(i); }

我希望它能打印3次十次,因为在调用每个代表时,我将3作为参数传递。但是,它要打印10十次。

以下是代码:

using System;
using System.Collections.Generic;

namespace ConsoleApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            ShowUsingDelegates();
            Console.ReadLine();
        }

        delegate void MyDelegate(int i);

        static void ShowUsingDelegates()
        {
            var myDelegates = new List<MyDelegate>();
            for (int i = 0; i < 10; i++)
            {
                myDelegates.Add(delegate {Console.WriteLine(i); });
            }

            foreach (var a in myDelegates)
            {
                a.Invoke(3);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

您的委托正在捕获变量i,该变量在循环后将为10。您忽略了委托的参数(本例中为3)。您还在委托声明中将此参数命名为i,但是在创建新的委托实例时忽略它并不重要。

尝试以下方法:

myDelegates.Add(delegate(int x) { Console.WriteLine(x); });