此问题来自之前关于C ++ Functors(Do functors have an equivalent in C#?)的讨论。
为什么C#不允许重载operator()?
你可以重载运算符但是如果operator()也可以重载会有什么好处呢?
答案 0 :(得分:2)
C#有operator()
,它拼写Invoke
。
无论何时定义delegate
类型,您都要使用名为Invoke
的方法定义一个类,并且可以对该类的实例使用函数调用语法,这将导致调用{{1 }}。与Invoke
类似,C#委托operator()
方法几乎可以有任何函数签名。
与C ++ Invoke
不同,C#不允许在定义operator()
的同一个类上定义任意其他成员。你可以说C#在这里强制执行单一责任原则。但是,这不是一个主要限制,因为C#委托连接到另一个为函数对象提供状态存储的对象。
与C ++ Invoke
相比,C#Invoke
更严重(在某种意义上没有简单的解决方法)限制是C#委托operator()
方法不能重载也不能多态。这是需要将调用转发给另一个对象的方法的结果,但它阻止了使用C ++自定义函子的一些使用场景。
如果您使用MSIL定义了重载的Invoke
方法,那将会很有趣。当然,如果您尝试使用这样的委托类,并且可能还有CLR运行时,您会混淆C#编译器。所以这是一个古玩而不是实用的方法。
C ++ Invoke
在功能和限制方面与C#委托类型非常相似。它还转发调用,并且在调用签名上不是多态的。同上C ++ 11 lambdas,虽然C ++ 14 lambdas将允许模板std::function
和调用 - 站点类型多态(不像C#lambdas只允许定义点多态)。