重载方法和模糊

一对夫妇一个月前,我写了一个简单的Java程序。

我曾称F两个重载方法,其中一个采用可变长度参数。 这一计划将无法编译,因为调用F(4)的主要方法是含糊不清,编译器不知道该选择哪种方法。

class Example { static void F(int... array) { Console.WriteLine("We are in first method"); } static void F(int x, int ... array) { Console.WriteLine("We are in second method"); } static void main() { F(4); } }

我在C#写了一个等效的程序如下,我期待一个编译错误。 令人惊讶的没有任何错误编译成功的程序。

该程序的输出是“我们在第二个方法”,这意味着被选为第二个重载的方法!

这不是奇怪? 两个F方法可以调用一个候选人,但为什么CLR选择第二个重载的方法?

class Example { static void F(params int[] array) { Console.WriteLine("We are in first method"); } static void F(int x, params int[] array) { Console.WriteLine("We are in second method"); } static void Main() { F(4); } }

--------------解决方案-------------

C#采取这种做法,因为它说,所以在C#语言规范:

7.4.3.2更好的函数成员给出一个参数列表A与一组参数表达式{E1,E2,...,EN}和两个适用的函数成员MP和MQ与参数类型{P1,P2,...,PN}和{Q1,Q2,...,QN},MP定义为比MQ有没有更好的函数成员

•每个参数,隐式转换,从EX到QX并不比从EX到PX的隐式转换好,

•至少有一个说法,从EX到PX的转换比从EX转换为QX更好。 当执行该评价中,如果MP或MQ是适用在其膨胀形式,则PX或QX指在参数列表中的扩展形式的参数。 在情况下,参数型序列{P1,P2,...,PN}和{Q1,Q2,...,QN}是相同的,下面的打破平局规则应用中,为了以确定更好的功能部件。

•如果MP是非泛型方法而MQ是泛型方法,则MP比MQ好。

否则,如果MP适用于正常形式和MQ有一个参数数组,只有在它的扩展形式是适用的,则MP比MQ好。

否则,如果MP具有比MQ更少的声明参数,则MP比MQ好。 如果这两种方法有PARAMS阵列和仅在其膨胀形式是适用可能出现这种情况。

•否则,如果MP有更具体的参数类型比MQ,则MP比MQ好。 让{R1,R2,...,RN}和{S1,S2,...,SN}表示非实例和未膨胀参数类型的MP和MQ的。 MP的参数类型比MQ的更具体的,如果对于每个参数,RX是不小于SX不太具体,并且对于至少一个参数中,RX比SX更具体:

o一个类型参数比非类型参数不太具体。

Ø递归,构造类型比另一种构造类型(有相同数量的类型参数)更具体的,如果至少一种说法是更加具体,没有类型参数是比其他的相应类型参数不太具体。

直径:数组类型比另一种阵列型(具有相同的维数)更具体的,如果第一个的元素类型比第二的元素类型更具体。

•否则,如果一个件是一种非提升运算,而另一个是一个提升运算,非提升一个更好。

•否则,两个函数成员是更好的。

编辑:有错误的部分突出显示。 现在固定。

Params也可以采取零参数,所以在这种情况下,当你调用F(4)它假设参数不通过,自4为int的相应方法被调用。

PARAMS

该params关键字可以指定采用可变数量的参数的方法的参数。 您可以发送一个逗号分隔的参数声明,或者指定类型的参数数组指定类型的参数列表。 您还可以发送任何参数。

我相信它会选择第二种方法,因为你是传递一个整数,而不是整数的数组。

分类:C# 时间:2012-01-18 人气:0
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.307 (s). 9 q(s)