C# 方法重载行为
我有以下代码示例:C# 方法重载行为,c#,.net,oop,methods,C#,.net,Oop,Methods,我有以下代码示例: public class Base { public virtual void MyMethod(int param) { Console.WriteLine("Base:MyMethod - Int {0}", param); } } public class Derived1 : Base { public override void MyMethod(int param) { C
public class Base
{
public virtual void MyMethod(int param)
{
Console.WriteLine("Base:MyMethod - Int {0}", param);
}
}
public class Derived1 : Base
{
public override void MyMethod(int param)
{
Console.WriteLine("Derived1:MyMethod - Int {0}", param);
}
public void MyMethod(double param)
{
Console.WriteLine("Derived1:MyMethod - Double {0}", param);
}
}
class Program
{
static void Main(string[] args)
{
Base objB = new Base();
objB.MyMethod(5);
Base objBD = new Derived1();
objBD.MyMethod(5);
Derived1 objD = new Derived1();
objD.MyMethod(5);
Console.ReadLine();
}
}
上述代码的输出如下:
基础:MyMethod-Int5
Derived1:MyMethod-Int5
Derived1:MyMethod-双5
对于使用'objD'的'MyMethod'的第三次调用,为什么在实际传递INT时使用'DOUBLE'重载
使用“objBD”的第二次调用似乎运行正常。请建议。我猜在调用MyMethod(5)时,5也可以是double或int,double具有更高的优先级。你试过调用MyMethod((int)5)吗?奇怪的是,前几天晚上我和Jon讨论过这个问题!有一个优先级问题-被重写的方法是在基类中定义的,因此为了“最佳方法”的目的,重载(即使是隐式转换)更可取,因为它是在最特定的类型(子类)中定义的 如果您重新声明了方法(
new
),那么它将获得优先权,但是您不能重写
和new
相同类型中具有相同名称和签名的方法-您必须添加额外的继承级别才能实现这一点
ECMA 334 v4的14.5.5和14.4.2中详细说明了具体的逻辑
基本上,要使基方法可调用,您必须强制转换为基类型,或者添加一个shim方法:
public void MyMethod2(int param) {base.MyMethod(param);}
我按照建议做了以下更改: 输出不变 基础:MyMethod-Int5 Derived1:MyMethod-Int5 Derived1:MyMethod-双5
5已经是int,显式转换没有帮助,它仍然可以隐式转换为double。顺便说一句,请使用“添加注释”而不是添加其他答案来回复特定的答案。是否有更新的ECMA规范,包括LINQ、自动属性等。?您所指的v4没有。或者,除此之外,什么文档包含所有这些内容?我应该买我在某处看到的带注释的C#规范书吗?你知道有电子版本吗?(我知道,劫持你的答案…:)我刚去买了一个带注释的C#spec的adobe版本,第三版,但我也会去下载那个word文档。谢谢
Derived1 objD = new Derived1();
objD.MyMethod((int)5);