为什么不能将代理作为普通函数传递(有时)。 例如:
public delegate int CompareBy(Rectangle first);
以下代码无法运行,
list.OrderBy(compare);
其中compare
作为参数传递,类型为CompareBy
。但是这个,
list.OrderBy(x => compare(x));
会工作吗? 我知道有很多帖子与此类似,但我找不到这样的例子。
答案 0 :(得分:3)
Enumerable.OrderBy
采用Func<TSource, TKey>
类型的参数。 CompareBy
是另一种类型,CompareBy
和Func<Rectangle, int>
之间没有隐式转换。
x => compare(x)
创建一个绑定到匿名函数的新Func<Rectangle, int>
实例,除了调用CompareBy
委托之外什么都不做。
摆脱错误的另一种方法是
list.OrderBy(compare.Invoke)
因为这可以在没有任何匿名函数的帮助下构建新的Func<Rectangle, int>
实例,或者更明确地构建
list.OrderBy(new Func<Rectangle, int>(compare.Invoke))
因为这就是使用compare.Invoke
实际上会解决的问题,或者
list.OrderBy(new Func<Rectangle, int>(compare))
这是完全相同的另一种语法。