无法使用FUNC调用函数

时间:2011-07-19 03:09:13

标签: c#-4.0

 protected void Page_Load(object sender, EventArgs e)
        {
            int k = 0;
            Func<int> p5 = () => { return k++; }; 
        }

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

我无法调用函数IntProducer(),语法错误了吗?

2 个答案:

答案 0 :(得分:1)

你永远无法调用该函数,因为你从未试图直接或间接调用它。

如果你想调用它,首先必须将函数存储在变量中,然后调用变量,就像你使用任何其他方法一样。

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

或者你可以创建一个lambda函数来调用它。

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

答案 1 :(得分:0)

我不确定你实际想要完成什么,但是你不需要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,只想直接定义它(就像原始代码中的lambda一样)。

根据你的问题中的代码,我会抛弃lambda,而不会打扰Func<T>。我只是直接拨打IntProducer,就像我答案顶部的代码一样。

BTW,这是原始代码中的lambda:

() => { return k; };

它基本上像一个未命名的函数。在这种情况下,该函数不带参数。