Область действия переменных внутри анонимных функций в 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();
        }

Моя IDE VS2008 выдает следующие ошибки: [Практика - это класс внутри практики пространства имен]

1. error CS1643: не все пути кода возвращают значение в анонимном методе типа «Practice.Practice.OtherDel» 2. error CS1593: делегат «OtherDel» не принимает аргументы «0».

В книге: Illustrated C# 2008 (стр. 373) сказано, что переменная int y внутри области действия определения del2. Тогда почему эти ошибки.


person Vinod    schedule 23.05.2010    source источник


Ответы (2)


Две проблемы;

  1. вы ничего не передаете в свой del2() Invoke, но он (OtherDel) принимает целое число, которое вы не используете — однако вам все равно нужно его предоставить (анонимные методы молча позволяют вам не объявлять params, если вы их не используете - они все еще существуют - ваш метод по сути такой же, как del2 = delegate(int notUsed) {...})
  2. делегат (OtherDel) должен возвращать int - ваш метод не

Область видимости в порядке.

person Marc Gravell    schedule 23.05.2010
comment
# 1 полностью правильно, но # 2: проверьте объявление типа OtherDel в верхней части кода OP: delegate void OtherDel(int x) - он ничего не возвращает. [EDIT: это было изменено при редактировании вопроса] - person Richard; 23.05.2010
comment
Ответ отражает вопрос в то время, когда я опубликовал это; p - person Marc Gravell; 23.05.2010

Ошибка не имеет ничего общего с областями. Ваш делегат должен возвращать целочисленное значение и принимать целочисленное значение в качестве параметра:

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);
}
person Darin Dimitrov    schedule 23.05.2010