Невозможно вызвать функцию с помощью FUNC - PullRequest
0 голосов
/ 19 июля 2011
 protected void Page_Load(object sender, EventArgs e)
        {
            int k = 0;
            Func<int> p5 = () => { return k++; }; 
        }

 public int IntProducer()   
        {   
         return x++;   
        } 

Я не могу вызвать функцию IntProducer (), синтаксис неправильный?

Ответы [ 2 ]

1 голос
/ 19 июля 2011

Вы никогда не могли вызвать функцию, потому что вы никогда не пытались вызвать ее прямо или косвенно.

Если вы хотите вызвать ее, сначала вы должны сохранить функцию в переменной, а затем вызвать переменную так, как вы бы это сделали.любой другой метод.

protected void Page_Load(object sender, EventArgs e)
{
    Func<int> producer = IntProducer; // store it
    int result = producer();          // call it
}

В качестве альтернативы вы можете создать лямбда-функцию для ее вызова тоже.

protected void Page_Load(object sender, EventArgs e)
{
    Func<int> producer = () => IntProducer(); // store the lambda
    int result = producer();                  // call it
}
0 голосов
/ 19 июля 2011

Я не уверен, чего вы на самом деле пытаетесь достичь, но вам не нужно Func<T> для вызова функции.Просто используйте этот синтаксис:

protected void Page_Load(object sender, EventArgs e)
{
    int k = IntProducer();
    // Todo: Do more with k here
}

public int IntProducer()   
{   
    return x++;   
}

Если вы обнаружите, что понимаете это очень хорошо и чувствуете, что на самом деле нуждаетесь в Func<T>, тогда вы можете просто назначить его иназовите его как это была обычная функция:

protected void Page_Load(object sender, EventArgs e)
{
    Func<int> theFunc = IntProducer;
    // Todo: Do some stuff here

    int k = theFunc(); // Calls `IntProducer`
    // Todo: Do more with k here
}

public int IntProducer()   
{   
    return x++;   
}

Это действительно полезно, только если вы хотите переключить метод, на который указывает theFunc во время работы, вы хотитепередать его другому методу, или вы даже не хотите беспокоиться о названии IntProducer, а просто хотите определить его напрямую (как ваша лямбда в исходном коде).

скод в вашем вопросе, я бы выбросил лямбду, и не стал бы беспокоиться с Func<T>.Я бы просто позвонил IntProducer напрямую, как код в верхней части моего ответа.

Кстати, это лямбда-код в вашем исходном коде:

() => { return k; };

Это в основном работает какбезымянная функция.В этом случае эта функция не принимает параметров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...