覆盖基本方法时,为什么默认参数不能正常工作?

时间:2012-12-27 06:01:44

标签: c# arguments

  

可能重复:
  C# optional parameters on overridden methods

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 个答案:

答案 0 :(得分:2)

默认参数在编译时填充,代码通过基类引用变量ob。正如预期的那样,虚方法覆盖在运行时工作。您可以使用方法 overload

来达到预期的效果
class A 
{
   public void Func(int value) 
   {

   }

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

class B: A
{
   public override void Func() 
   {
        Func(12);
   }
}

答案 1 :(得分: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();
        }
    }

答案 2 :(得分:0)

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

A ob = new B();

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

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

B ob = new B();

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

答案 3 :(得分:0)

默认参数值为静态绑定。