隐式委托投射

Ill*_*ack 1 c# delegates casting dynamic

我想知道是否有一些方法可以将方法组,匿名方法或lambda表达式转换为System.Delegate而不知道确切的委托类型,如

var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};
Run Code Online (Sandbox Code Playgroud)

我需要一种方法,适用于任何带有任何参数和返回类型的方法,而不使用反射.谢谢你的回答.

Mar*_*ell 6

不可能,因为委托必须具有单个定义的类型,但多个委托可以具有相同的签名.这使得委托类型不明确 - 编译器无法在这样的语句中稳健地选择适当的类型.注意匹配的签名的该委托实例,但不同类型的没有互换.例如,是:

i => (i % 2) == 0
Run Code Online (Sandbox Code Playgroud)

A Func<int,bool>,还是Predicate<int>?或者是其他东西?请注意,通用艺术的数量是无关紧要的; 一ActionThreadStartMethodInvoker都只是空洞非泛型参数的代表.

此外,还有一个额外的复杂性/模糊性,因为lambdas也可以编译为表达式树,而不仅仅是委托:

Func<int, bool> x = i => (i % 2) == 0;
Expression<Func<int, bool>> y = i => (i % 2) == 0;
Run Code Online (Sandbox Code Playgroud)

表达式树与代表完全不同.