2008-10-24 39 views
0

C#.NET 3.5。我試圖理解C#Action對象的內在限制。在lamda中(實際上是lamdas?),我們可以執行賦值,調用函數,甚至執行三元操作,但是我們不能執行多語句操作。C#操作的限制lambda代碼塊

這是因爲單語句執行只是語法糖包裝它在委託?爲什麼下面的第一個例子不起作用?

public class MyClass 
{ 
    private int m_Count = 0; 

    public void Test() 
    { 
     int value = 0; 

     // Does not work, throws compile error 
     Action action =() => { if(m_Count < 10) m_Count++; value = m_Count; } 

     // Works 
     Action action2 =() => value = delegate(){ 
      if(m_Count < 10) 
       m_Count++; 

      return m_Count; 
     }; 

     // Works 
     Action action3 =() => value = m_Count; 

     // Works 
     Action action4 =() => value = m_Count < 10 ? m_Count++ : 0; 

     // Works 
     Action action5 =() => value = Increment(); 
    } 

    public int Increment() 
    { 
     if (m_Count < 10) 
      m_Count++; 

     return m_Count; 
    } 
} 

編輯:Grr,抱歉的噪音。我本來

Action action =() => if(m_Count < 10) m_Count++; value = m_Count; 

扔哪一個編譯錯誤,但我想我會嘗試在括號

Action action =() => { if(m_Count < 10) m_Count++; value = m_Count; } 

其中還扔了一個編譯錯誤,它包裹後前右,所以我跳下得出的結論是這是同樣的問題。如果我在大括號後面用分號折騰

Action action =() => { if(m_Count < 10) m_Count++; value = m_Count; }; 

不好意思!

編輯2:感謝cfeduke,你發佈,在我上面編輯的同時 - 繼續並標記爲答案。

+0

不能立即看到有什麼問題 - 你得到了什麼編譯錯誤? – 2008-10-24 16:27:49

回答

11

你缺少一個分號,它編譯:

Action action =() => { if (m_Count < 10) m_Count++; value = m_Count; }; 

當你說type name = statement;你需要一個分號,即使您使用大括號的代碼塊。

+0

我想下面也應該工作:? `Action action =(thrshld)=> {if(m_Count 2011-02-04 20:34:15

5

cfeduke發佈了讓您的代碼編譯的解決方案。

請注意,您不能將語句塊lambda表達式轉換爲表達式樹,即使您可以將它們轉換爲委託。有什麼可以轉換成表達式樹的other limitations。例如,您不能在lambda表達式中編寫迭代器塊。例如,您可以在lambda表達式中編寫迭代器塊。 (我之前就想這麼做 - 當你試圖讓自己的頭部變圓時,它會變得很奇怪,儘管你不能這樣做)。在大多數情況下,你幾乎可以做任何你能在方法中做的事情。