4

可能重复:
覆盖方法上的 C# 可选参数

using System;
namespace Apple
{
    class A
    { 
        public virtual void Func(int a=4){
            Console.WriteLine(" A Class: "+a);
        }
    }
    class B : A
    {
        public override void Func(int a = 12)
        {
            Console.WriteLine(" B Class: "+ a);
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            A ob = new B();
            ob.Func();
            Console.ReadLine();
        }
    }
}
// Output: B Class: 4
4

4 回答 4

2

默认参数在编译时填充,代码ob通过基类引用一个变量。正如预期的那样,虚拟方法覆盖在运行时工作。您可以通过使用方法重载来达到预期的效果:

class A 
{
   public void Func(int value) 
   {

   }

   public virtual void Func() 
   {
        Func(4);
   }
}

class B: A
{
   public override void Func() 
   {
        Func(12);
   }
}
于 2012-12-27T06:14:38.503 回答
1

编译器根据对象的类型放置默认参数值,并在编译时完成。
因此编译后的代码如下所示:

using System;
namespace Apple
{
    public class Program
    {
        private static void Main(string[] args)
        {
            A ob = new B();
            ob.Func(4);
            Console.ReadLine();
        }
    }
}


您可以通过执行以下操作获得所需的结果:

public class Program
    {
        static void Main(string[] args)
        {
            A ob = new B();
            ((B)ob).Func();
            Console.ReadLine();
        }
    }
于 2012-12-27T06:15:33.297 回答
0

默认参数值为静态绑定。

于 2012-12-27T06:15:30.350 回答
0

因为您创建了 A 类的实例,它引用了 B 类的地址。

A ob = new B();

由于实例属于A类,所以你调用的方法指向A类中的方法。你可以通过调试来检查这一点,然后执行代码。

相反,如果您创建 B 类的实例,即

B ob = new B();

它将调用 B 类的 Fun() 方法,并将输出显示为“B 类:12”

于 2012-12-27T06:09:54.943 回答