class foo
{
public void bar(int i) { ... };
public void bar(long i) { ... };
}
foo.bar(10);
我希望这段代码会给我一些错误,或者至少是一个警告,但事实并非如此......
调用什么版本的 bar(),为什么?
正在调用 bar 的 int 版本,因为10
是 int 文字,编译器将查找与输入变量最匹配的方法。要调用长版本,您需要指定一个长文字,如下所示:foo.bar(10L);
这是 Eric Lippert 发表的一篇关于更复杂版本的方法重载的文章。我会尝试解释一下,但他做得更好,我可以:http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambigously-overloads-part-one.aspx http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspx
来自 C# 4.0 规范:
方法重载允许多个
同一类中的方法具有
相同的名称,只要它们具有唯一性
签名。当编译一个
调用重载方法,
编译器使用重载决策
来确定具体方法
调用。过载解析发现
最匹配的一种方法
参数或报告错误,如果没有
可以找到单个最佳匹配。这
以下示例显示了过载
决议生效。评论为
Main 方法中的每次调用
显示实际上是哪个方法
调用。
class Test {
static void F() {
Console.WriteLine("F()");
}
static void F(object x) {
Console.WriteLine("F(object)");
}
static void F(int x) {
Console.WriteLine("F(int)");
}
static void F(double x) {
Console.WriteLine("F(double)");
}
static void F<T>(T x) {
Console.WriteLine("F<T>(T)");
}
static void F(double x, double y) {
Console.WriteLine("F(double,double)");
}
static void Main() {
F(); // Invokes F()
F(1); // Invokes F(int)
F(1.0); // Invokes F(double)
F("abc"); // Invokes F(object)
F((double)1); // Invokes F(double)
F((object)1); // Invokes F(object)
F<int>(1); // Invokes F<T>(T)
F(1, 1); // Invokes F(double, double)
}
}
如示例所示,特定的
方法始终可以通过以下方式选择
显式地将参数转换为
确切的参数类型和/或
显式提供类型参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)