Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么不能始终以与函数相同的方式传递委托_C#_Delegates - Fatal编程技术网

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))