Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法重载行为_C#_.net_Oop_Methods - Fatal编程技术网

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);