.net 3.5 - C# Action lambda 代码块的限制
本文关键字:代码 lambda Action net | 更新日期: 2023-09-27 17:47:22
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,您在我上面的编辑的同时发布了它 - 继续并标记为答案。
您缺少一个分号,它会编译:
Action action = () => { if (m_Count < 10) m_Count++; value = m_Count; };
当你说type name = statement;
你需要一个分号,即使你对代码块使用大括号。
cfeduke发布了编译代码的解决方案。
请注意,您无法将语句块 lambda 表达式转换为表达式树,即使您可以将它们转换为委托。对于可以转换为表达式树的内容,还有其他限制。
回到委托,那里有一些限制 - 例如,你不能在lambda表达式中编写迭代器块。(我之前就想这样做 - 当你试图绕过它时,它会变得很奇怪。不过你不能这样做。在大多数情况下,您几乎可以在方法中执行任何操作。