Mat*_*att 0 c# lambda .net-3.5
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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:格尔,对不起噪音.原来,我有
Action action = () => if(m_Count < 10) m_Count++; value = m_Count;
Run Code Online (Sandbox Code Playgroud)
哪个引发了编译错误,但就在帖子之前我认为我会尝试将其包装在大括号中
Action action = () => { if(m_Count < 10) m_Count++; value = m_Count; }
Run Code Online (Sandbox Code Playgroud)
这也引发了编译错误,所以我得出结论认为这是同样的问题.但是,如果我在括号后折成一个分号,它就可以工作
Action action = () => { if(m_Count < 10) m_Count++; value = m_Count; };
Run Code Online (Sandbox Code Playgroud)
对不起,噪音!
编辑2:谢谢cfeduke,你在我上面编辑的同时发布了 - 继续并标记为答案.
cfe*_*uke 11
你错过了一个分号,它编译:
Action action = () => { if (m_Count < 10) m_Count++; value = m_Count; };
Run Code Online (Sandbox Code Playgroud)
当你说type name = statement;你需要一个分号时,即使你使用大括号代码块.