C# .NET 3.5。我试图了解 C# Action 对象的内在限制。在 lamda(实际上是 lamdas 吗?)中,我们可以执行赋值、调用函数,甚至执行三元运算,但不能执行多语句运算。
这是因为单语句执行只是将其包装在委托中的语法糖吗?为什么下面的第一个示例不起作用?
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,您在我上面的编辑同时发布 - 继续并标记为答案。