2

I've run into something odd in a .NET CF 2.0 project for Pocket PC 2003 (Visual Studio 2005). I was dealing with a System.IO.Stream object and found that the IDE wouldn't auto-complete the Dispose() method. I typed it in manually and received:

'System.IO.Stream.Dispose(bool)' is inaccessible due to its protection level

The error is referring to the protected Dispose(bool) method. Dispose() is either private or not present.

Question 1: How is this possible? Stream implements IDisposable:

public abstract class Stream : MarshalByRefObject, IDisposable

... and IDisposable requires a Dispose() method:

public interface IDisposable
{
    void Dispose();
}

I know the compiler won't let me get away with that in my code.

Question 2: Will I cause problems by working around and disposing my streams directly?

IDisposable idisp = someStream;
idisp.Dispose();

The implicit cast is accepted by the compiler.

Edit: This was already answered in question 939124. The Stream class implements IDisposable explicitly. That's a language feature I completely forgot about.

Community
  • 1
  • 1
mvanbem
  • 578
  • 4
  • 11
  • 1
    I recommend using the `using` construct, which does a cast to `IDisposable` for you. – Stephen Cleary May 18 '10 at 15:46
  • possible duplicate of [How is IDisposable implemented on FileStream in .Net 1.1](http://stackoverflow.com/questions/939124/how-is-idisposable-implemented-on-filestream-in-net-1-1) – Austin Salonen May 18 '10 at 15:48

1 Answers1

6

Stream implements the IDisposable interface, but hides the 'official' name Dispose and exposes the method Close that calls it internally. So calling Stream.Close() equals calling IDisposable.Dispose().

And q2: No that won't cause a problem but it isn't necesary.

Jouke van der Maas
  • 4,117
  • 2
  • 28
  • 35
  • Yeah, I just saw in another question's answers that Stream implements the interface explicitly. That's a language feature I completely forgot about. – mvanbem May 18 '10 at 15:42