Is there a situation in which Dispose won't be called for a 'using' block?

c#, dispose, using

Solution

void Main()
{
    try
    {
        using(var d = new MyDisposable())
        {
            throw new Exception("Hello");
        }
    }
    catch
    {
        "Exception caught.".Dump();
    }

}

class MyDisposable : IDisposable
{
    public void Dispose()
    {
        "Disposed".Dump();
    }
}

This produced :

Disposed
Exception caught

So I agree with you and not with the smarty interviewer...

Problem

This was a telephone interview question I had: Is there a time when Dispose will not be called on an object whose scope is declared by a using block? My answer was no - even if an exception happens during the using block, Dispose will still be called. The interviewer disagreed and said if `using` is wrapped in a `try`-`catch` block then Dispose will not be called by the time you enter the catch block. This goes contrary to my understanding of the construct, and I haven't been able to find anything that backs up the interviewers point of view. Is he correct or might I have misunderstood the question?

Original source

Related problems