为什么代理不能像函数一样传递

时间:2015-11-22 12:44:33

标签: c# delegates

为什么不能将代理作为普通函数传递(有时)。 例如:

public delegate int CompareBy(Rectangle first);

以下代码无法运行,

list.OrderBy(compare);

其中compare作为参数传递,类型为CompareBy。但是这个,

list.OrderBy(x => compare(x));

会工作吗? 我知道有很多帖子与此类似,但我找不到这样的例子。

1 个答案:

答案 0 :(得分:3)

Enumerable.OrderBy采用Func<TSource, TKey>类型的参数。 CompareBy是另一种类型,CompareByFunc<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))

这是完全相同的另一种语法。