有没有办法将以下两行合并为一个语句?
Func<XmlNode> myFunc = () => { return myNode; };
XmlNode myOtherNode = myFunc();
我一直在尝试类似下面的内容,但无法让它工作,无法从文档中确定它是否应该起作用?
XmlNode myOtherNode = ((Func<XmlNode>) () => { return myNode; })();
答案 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)。
正如这可能看起来的那样,我今天用它来实现......