2012-09-14 33 views
5

我可以使用两个相同的函数名称,但参数相同但含义不同。函数过载

例如:

public void test(string name) 

public void test(string age) 

谢谢。

+0

当然,如果您要将'age'表示为['TimeSpan'](http://msdn.microsoft.com/zh-cn/library/system.timespan.aspx),这不会是问题。 – Rawling

+0

@简直就是,简直就是任何形式的数字类型。 =) –

+0

有一个共同的参数,比如'string args' –

回答

4

不,你不能。签名没有区别 - 参数名称无关紧要。

通过指定访问级别(如public或private),可选修饰符(如抽象或密封),返回值,方法名称和任何方法参数,在类或结构中声明方法。这些部分一起是方法的签名。

http://msdn.microsoft.com/en-us/library/ms173114.aspx

像其他几个答案都表示,考虑你正在服用的数据类型。名称确实是一个典型的字符串,但年龄必须是?如果你允许它是 - 例如 - int那么你可以根据需要重载你的方法。

1

Signatures and Overloading

如果需要使用不同的意义的方法你为什么不创建一个不同的名称的方法?在同一个对象上为不同的事物使用相同的方法名称会令人困惑。

3

不,您不能在返回类型或参数名称上重载。与其他一些语言不同(最显着的是,Objective C )参数名称不是您函数签名的一部分。

方法的签名由方法的名称,每个形式参数的类型和种类(值,引用或输出)组成,按照从左到右的顺序考虑。方法的签名特别不包括返回类型,也不包括可能为最右边参数指定的参数修饰符。


甚至有它的不完全变成了选择的部分参数名称。

+0

+1,对Objective C – PeteH

2

您可以使用静态方法和非静态方法具有相同的名称,但遵循与方法重载相同的规则的不同参数,但它们不能具有完全相同的签名。

+0

有趣的见解......但这对于维护来说是一个坏主意! – PeteH

1

你可以混合在一起使用可选参数和默认值这些方法:

public void test(string name = null, string age = null) 
{ 
    if (name != null) 
    { 
    // Do something 
    } 
    else if (age != null) 
    { 
    // Do something else 
    } 
} 

而你可以调用这个方法类似:

test(name: "John"); 
test(age: "30"); 

不是很干净,但仍然可用。

0

否 - 编译器抛出一个错误,因为编译器使用参数来确定调用哪个方法,而不是返回类型。

0

NO。

过载函数必须有不同的SIGNATURE。 即参数应该不同,无论是参数的数量还是不同数据类型参数的顺序。