C#中匿名函数内变量的范围

时间:2010-05-23 07:41:48

标签: c# scope anonymous-methods

我对C#中匿名函数内的变量范围有疑问。

考虑以下计划:

 delegate void OtherDel(int x);

        public static void Main()
        {
            OtherDel del2;
            {
                int y = 4;
                del2 = delegate
                {
                      Console.WriteLine("{0}", y);//Is y out of scope
                };
            }

           del2();
        }

我的VS2008 IDE出现以下错误: [实践是命名空间实践中的一个类]

1.error CS1643:并非所有代码路径都在“Practice.Practice.OtherDel”类型的匿名方法中返回值 2.error CS1593:委托'OtherDel'不接受'0'参数。

在一本书中说明:插图C#2008(页373),int变量y在 del2定义的范围内。 那么为什么会出现这些错误。

2 个答案:

答案 0 :(得分:4)

两个问题;

  1. 您没有在del2()调用中传递任何内容,但它(OtherDel)采用您不使用的整数 - 您仍然需要提供它虽然(匿名方法默默地让你不要声明params,如果你不使用它们 - 它们仍然存在 - 但你的方法本质上del2 = delegate(int notUsed) {...}相同)
  2. 代理人(OtherDel)必须返回int - 您的方法不会
  3. 范围很好。

答案 1 :(得分:2)

错误与范围无关。您的委托必须返回一个整数值并将整数值作为参数:

del2 = someInt =>
{
    Console.WriteLine("{0}", y);
    return 17;
};
int result = del2(5);

所以你的代码可能如下所示:

delegate int OtherDel(int x);
public static void Main()
{
    int y = 4;
    OtherDel del = x =>
    {
        Console.WriteLine("{0}", x);
        return x;
    };
    int result = del(y);
}