2011-07-19 80 views
0
protected void Page_Load(object sender, EventArgs e) 
     { 
      int k = 0; 
      Func<int> p5 =() => { return k++; }; 
     } 

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

我無法調用函數IntProducer(),語法錯誤嗎?無法使用FUNC調用函數

回答

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 
} 
+0

第一個版本很好。第二個版本將起作用,但沒有意義,甚至可能更令人困惑...... –

+0

感謝Merlyn Morgan-Graham的偉大工程。 – happysmile

0

我不知道你實際上試圖完成的任務,但你並不需要一個Func<T>調用的函數。如果你發現你明白這真的很好,感覺你實際上有需要的Func<T>,那麼你可以指定它,並把它它是一個

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

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

:只要使用此語法正常功能:

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,就像我答案頂部的代碼一樣。

順便說一句,這是你的原代碼拉姆達:

() => { return k; }; 

它基本上就像一個未命名的功能。在這種情況下,該函數不帶參數。