当前位置:  开发笔记 > 编程语言 > 正文

C#Action Lambda代码块的局限性

如何解决《C#ActionLambda代码块的局限性》经验,为你挑选了2个好方法。

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;
    }
}

编辑:格尔,对不起噪音.原来,我有

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,你在我上面编辑的同时发布了 - 继续并标记为答案.



1> cfeduke..:

你错过了一个分号,它编译:

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

当你说type name = statement;你需要一个分号时,即使你使用大括号代码块.



2> Jon Skeet..:

cfeduke发布了使代码编译的解决方案.

请注意,您无法将语句块lambda表达式转换为表达式树,即使您可以将它们转换为委托.您可以转换为表达式树的内容还有其他限制.

回到代理,那里有一些限制 - 例如,你不能在lambda表达式中编写迭代器块.(我之前想要这样做 - 当你试图让它绕过它时会很奇怪.但你不能这样做.)在大多数情况下,你几乎可以做任何你能用方法做的事情.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有