是否可以在单个语句中声明和使用匿名函数?

时间:2009-03-28 12:37:08

标签: c# lambda

有没有办法将以下两行合并为一个语句?

Func<XmlNode> myFunc = () => { return myNode; };
XmlNode myOtherNode = myFunc();

我一直在尝试类似下面的内容,但无法让它工作,无法从文档中确定它是否应该起作用?

XmlNode myOtherNode = ((Func<XmlNode>) () => { return myNode; })();

4 个答案:

答案 0 :(得分:6)

我不确定你为什么要这样做但是......

XmlNode myOtherNode = new Func<XmlNode>( () => { return myNode; } )();

应该这样做。

答案 1 :(得分:2)

'技巧'是你需要创建一个委托的实例才能使它工作,在你的例子中,当你进行赋值时(myFunc = ...),这是完美的。此外,您可以将您的功能表达为()=&gt; myNode缩短了。

XmlNode myOtherOne = new Func<XmlNode>( () => myNode )();

答案 2 :(得分:2)

“headling”发布的语法有效。

奇怪的是,即使您不能将原始语法与lambda(=>)一起使用,也可以使用delegate

XmlNode myOtherNode = ((Func<XmlNode>) delegate { return myNode; })();

当然,真正的问题是......为什么?有什么问题...

XmlNode myOtherNode = myNode;

答案 3 :(得分:0)

我以为我会把这个结构的另一个有趣的用法放到混合中:

namespace FunWithContractsAndAnonymousDelegates
{
    using System;
    using System.Collections.Generic;
    using System.Diagnostics.Contracts;
    using System.Linq;

    internal static class Program
    {
        private static void MySort<T>(T[] array, int index, int length, IComparer<T> comparer)
        {
            Contract.Requires<ArgumentNullException>(array != null);
            Contract.Requires<ArgumentOutOfRangeException>(index >= 0 && index <= array.Length);
            Contract.Requires<ArgumentOutOfRangeException>(length >= 0 && index + length <= array.Length);
            Contract.Ensures(new Func<T[], int, int, IComparer<T>, bool>((_array, _index, _length, _comparer) =>
                {
                    T[] temp = (T[])_array.Clone();
                    Array.Sort(temp, _index, _length, _comparer);
                    return temp.SequenceEqual(_array);
                })(array, index, length, comparer));

            // TODO: Replace with my heavily optimized and parallelized sort implementation...
            Array.Sort(array, index, length, comparer);
        }

        private static void Main(string[] args)
        {
            int[] array = { 3, 2, 6, 1, 5, 0, 4, 7, 9, 8 };
            MySort(array, 0, array.Length, Comparer<int>.Default);
            foreach (int value in array)
            {
                Console.WriteLine(value);
            }
        }
    }
}

声明和调用匿名委托意味着我不必声明一个方法,我只使用一次来检查后置条件(即调用Contract.Ensures)。

正如这可能看起来的那样,我今天用它来实现......