为何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
相关产品推荐
相关产品推荐

