繁体   English   中英

c#6 bug? 虚拟新方法奇怪的行为

[英]c# 6 bug? virtual new method strange behavior

我有这个代码:

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo();
            Bar bar = new Bar();
            Baz baz = new Baz();
            Foo fooBar = new Bar();
            Foo fooBaz = new Baz();
            Bar barBaz = new Baz();

            foo.Test();
            bar.Test();
            baz.Test();
            fooBar.Test();
            fooBaz.Test();
            barBaz.Test();

            Console.ReadLine();
        }
    }

    internal class Foo
    {
        public virtual void Test()
        {
            Console.WriteLine("Foo");
        }
    }

    internal class Bar : Foo
    {
        public new virtual void Test()
        {
            Console.WriteLine("Bar");
        }
    }

    internal class Baz : Bar
    {
        public override void Test()
        {
            Console.WriteLine("Baz");
        }
    }
}

它输出我:

Foo
Bar
Baz
Foo
Foo
Baz

但是,我认为它应该是:

Foo
Bar
Baz
Foo
Baz
Baz

因为Baz压倒了这个方法。 这里发生了什么? 我错过了什么吗? 为什么fooBaz.Test()的输出是“Foo”而不是“Baz”?

Buz压倒了这个方法,这就是原因

Bar barBaz = new Baz();
barBaz.Test();

将打印Baz

但是Bar并没有覆盖 - 它隐藏了基本方法Test并使新方法成为虚拟方法。 然后Baz重写了Bar的新方法,而不是来自Foo的方法。 所以如果你像这样引用它: Foo fooBaz = new Baz(); 然后fooBaz被视为Foo一个实例,它不知道隐藏方法。

如果您将public new virtual void Test()更改为public override void Test()则会生成您期望的输出。

另请参阅以下主题:

当你在Bar.Test上使用new关键字时,你说它与Foo.Test没有任何关系,除了它具有相同的名称。 由于Baz继承自Bar,它会覆盖Bar.TestFoo.Test修改Foo.Test

当你调用fooBaz.Test它会查找未修改的Foo.Test方法并输出“Foo”。

当你调用barBaz.Test它会查找覆盖的Bar.Test方法并输出“Baz”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM