为什么退出 "using" 会调用意外的 Dispose()?

Why exiting "using" invokes unexpected Dispose()?

这是我的案例:

class A : IDisposable
{
    public void Dispose() { Console.WriteLine("A Dispose"); }
}

class B : A
{
    public new void Dispose(){ Console.WriteLine("B Dispose"); }
}

class Program
{
    static void Main(string[] args)
    {
        using (B b = new B())
        {
        }
    }
}

最终输出为“A Dispose”。 我读过一些介绍 override 和 new 区别的文档,还有一些说“using”实质上等于“try-finally”的东西。但我仍然无法回答为什么 B::Dispose 没有被自动调用。 比较下面的输出是“B Dispose”

B b = new B();
try
{
}
finally
{
    b.Dispose();
}

请帮忙,我错过了什么。

根据the C# language specification,对于参考类型:

using (ResourceType resource = «expression» ) «statement»

相当于

{
    ResourceType resource = «expression»;
    try {
        «statement»;
    }
    finally {
        IDisposable d = (IDisposable)resource;
        if (d != null) d.Dispose();
    }
}

如您所见,资源首先被转换为 IDisposable,这意味着 ADispose 是被调用的,因为 BDispose 只是隐藏它而不是覆盖它。

如果您想在 class 层次结构中正确实施 IDisposablesee the best practices for this in the documentation