【发布时间】:2010-04-16 07:48:47
【问题描述】:
假设我定义了这三个方法:
int F1(int, int);
int F1(float, float);
Float F1(int, int);
我在这里调用方法 F1:
Console.writeline(F1(5,6).ToString()));
它将调用哪个方法以及为什么?
【问题讨论】:
假设我定义了这三个方法:
int F1(int, int);
int F1(float, float);
Float F1(int, int);
我在这里调用方法 F1:
Console.writeline(F1(5,6).ToString()));
它将调用哪个方法以及为什么?
【问题讨论】:
第一个和第三个函数不会在同一个命名空间中编译。
这是因为函数签名根据参数的类型和数量来区分,并且它们是相同的。返回类型不被视为方法签名的一部分。
如果您在名称空间中只有第一个和第二个(或第二个和第三个),则将调用最合适的一个(传入整数类型的那个,就像您传入整数一样)。
Eric Lippert 在blog entries 中谈到了 C# 的精妙之处。
【讨论】:
class Program
{
static void Main(string[] args)
{
Add(3, 4,3);
}
public static void Add(int FN, int SN)
{
Console.WriteLine("Total is {0}", FN + SN);
}
public static void Add(int FN, int SN, int TN)
{
Console.WriteLine("Total is {0}", FN + SN + TN);
}
}
方法重载和函数重载术语可以互换使用。方法重载允许一个类有多个同名的方法。但有不同的签名。 C# 函数可以根据参数的数量、类型(int、float 等)和种类(Value、ref 或 out)进行重载。 方法的签名不包括返回类型和参数修饰符。因此,不能根据返回类型和参数修饰符重载函数。
【讨论】:
编译错误,因为在您的程序中使用了两次相同的函数签名!
int F1(int, int);
Float F1(int, int);
函数签名是 (函数名称 + 参数数量 + 每个参数的类型) 这在你的情况下是一样的......
【讨论】:
你试过了吗?
你会认为它应该执行:
int F1(int, int);
或
Float F1(int, int);
然而,函数重载对返回值不起作用——参数类型必须是唯一的,所以这甚至无法编译。
【讨论】:
在 C# 中,它是 参数 重载,而不是函数重载。您可以更改方法的输入参数,这可能会导致不同的返回类型,但您不能指定不同的返回类型来区分您的方法。
【讨论】:
在函数重载中,函数的名称相同,但参数类型或参数数量不同。
在函数重载中不考虑函数的返回类型。
所以这段代码甚至无法编译。因为你不能在一个命名空间中编写完全相同的函数。
【讨论】: