You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何C#中调用Invoke方法编译通过,直接返回Func<int,int>却失败?

为什么返回Func<int,int>失败但返回Invoke方法组成功?

这个问题的核心在于C#对委托类型转换的规则限制,咱们来拆解清楚:

首先要明确:test 和 Func<int, int> 是两个独立的委托类型——哪怕它们的方法签名(输入参数类型、返回值类型)完全一致,C#也不会允许它们之间的隐式转换。就像两个结构完全相同但类名不同的自定义类,你不能直接把一个类的实例赋值给另一个类的变量,所以return f;会编译失败,本质是编译器拒绝这种无显式声明的跨委托类型转换。

那为什么return f.Invoke;能正常编译?
因为f.Invoke是一个方法组,它代表的是Func<int,int>委托实例自带的Invoke方法本身,这个方法的签名正好和test委托的签名完全匹配(接收int参数,返回int)。而C#有一个规则:匹配签名的方法组可以隐式转换到对应的委托类型。编译器会自动帮你把这个方法组包装成一个test类型的委托实例,所以这行代码能顺利通过编译。

如果想让Fail()方法也能编译通过,你可以显式指定类型转换,比如:

public test Fail() {
    Func<int, int> f = x => x;
    return (test)f; // 显式转换后编译成功
}

内容的提问来源于stack exchange,提问作者Evgeniy Terekhin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:12:48