C# 为什么不能始终以与函数相同的方式传递委托
为什么不能将委托作为普通函数传递(有时)。 例如:C# 为什么不能始终以与函数相同的方式传递委托,c#,delegates,C#,Delegates,为什么不能将委托作为普通函数传递(有时)。 例如: public delegate int CompareBy(Rectangle first); 下面的代码不起作用 list.OrderBy(compare); 其中,compare作为参数传递,类型为CompareBy。但是这个, list.OrderBy(x => compare(x)); 会有用的。 我知道有很多类似的帖子,但我找不到这样的例子 可枚举。OrderBy接受类型为Func的参数CompareBy是另一种类型,在C
public delegate int CompareBy(Rectangle first);
下面的代码不起作用
list.OrderBy(compare);
其中,compare
作为参数传递,类型为CompareBy
。但是这个,
list.OrderBy(x => compare(x));
会有用的。
我知道有很多类似的帖子,但我找不到这样的例子
可枚举。OrderBy
接受类型为Func
的参数CompareBy
是另一种类型,在CompareBy
和Func
之间没有隐式转换
x=>compare(x)
创建一个新的绑定到匿名函数的Func
实例,该实例只调用CompareBy
委托
消除错误的另一种方法是
list.OrderBy(compare.Invoke)
因为它能够构造一个新的Func
实例,而无需任何匿名函数的帮助,或者更明确地说
list.OrderBy(new Func<Rectangle, int>(compare.Invoke))
这是做同样事情的另一种语法。
x=>compare(x)
也将转换为委托类型。您是否在问为什么重载解析不适用于此方法组转换?谢谢您的关注。我不明白,为什么CompareBy和Func之间没有隐式转换compare
是一个具体的实现,它将Recatangle
作为参数并返回int
。对不起,如果这个问题很愚蠢的话,但我是C#新手,我对这类东西没有深入了解。提前感谢。@DPM这也是为什么在类A{public int i;}
和类B{public int i;}
之间没有隐式转换的原因:运行时不能排除类型信息本身在某些方面也可能相关,即使在您的情况下不是这样。无论出于何种原因,程序员(您?)选择不使用相同的委托类型,并且运行时不会事后猜测程序员的意图。程序员可以选择只使用Func
并删除CompareBy
委托,从而完全避免此问题。
list.OrderBy(new Func<Rectangle, int>(compare))