如果代表不能超载,那么'Func'和'Action'有16个重载?

时间:2018-03-23 11:55:01

标签: c# .net delegates overloading

我一直在学习代表(在C#中),我读过的所有文章都说代理不能超载(与方法不同)。 但是当我使用'Func'和'Action'方法(它是.NET内置委托)时,我注意到它们已经被重载:

enter image description here

怎么可能?

2 个答案:

答案 0 :(得分:4)

这里的重载是以委婉的方式使用的。

它实际告诉你的是,有16种类型,它们都恰好是委托类型,并且都具有相同的名称。他们采用不同数量的通用参数这一事实意味着这些类型之间没有实际关系。

正在使用重载术语,因为委托类型通常用于它们类似于方法的上下文中, if 它们是方法而不是委托(并且属于相同的包含类型)它们将是过载。

答案 1 :(得分:3)

您不能拥有包含更多重载的单个委托类型。但是,您可以使用多个具有相同名称但具有不同数量的通用参数的委托类型,例如FuncAction

这对于方法重载是不同的,重载可以指定具有不同类型的相同数量的参数,多个委托类型必须具有不同数量的通用参数才有效

所以这是无效的

delegate void A();
delegate void A(int d);

但这是有效的:

delegate void A();
delegate void A<T>(T d);

同样具有相同名称的不同委托类型不兼容,它们本质上是不同的类型,恰好会共享一个名称。