title: ClientBase doesn't implement IDisposable member
body: <p>How is it possible for the System.ServiceModel.ClientBase abstract class to implement IDisposable Interface if the Dispose() Method declaration is not visible/declared?</p>
  
  <p>If I try to do the same I get an error and can't compile</p>
  
  <pre><code>abstract class ATeste : IDisposable
  {
  }
  </code></pre>
  
  <p>'ATeste' does not implement interface member 'System.IDisposable.Dispose()'</p>
  
  <p>I'm using VS 2010 and Framework 4.0.</p>
  
  <p>Check the ClientBase declaration:</p>
  
  <pre><code>    // Summary:
  //     Provides the base implementation used to create Windows Communication Foundation
  //     (WCF) client objects that can call services.
  //
  // Type parameters:
  //   TChannel:
  //     The channel to be used to connect to the service.
  public abstract class ClientBase&lt;TChannel&gt; : ICommunicationObject, IDisposable where TChannel : class
  {
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the default target endpoint from the application configuration
      //     file.
      //
      // Exceptions:
      //   System.InvalidOperationException:
      //     Either there is no default endpoint information in the configuration file,
      //     more than one endpoint in the file, or no configuration file.
      protected ClientBase();
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the callbackInstance as the callback object in a duplex conversation.
      //
      // Parameters:
      //   callbackInstance:
      //     The callback object that the client application uses to listen for messages
      //     from the connected service.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The callback instance is null.
      //
      //   System.InvalidOperationException:
      //     Either there is no default endpoint information in the configuration file,
      //     more than one endpoint in the file, or no configuration file.
      protected ClientBase(InstanceContext callbackInstance);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the configuration information specified in the application configuration
      //     file by endpointConfigurationName.
      //
      // Parameters:
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The specified endpoint information is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(string endpointConfigurationName);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the specified binding and target address.
      //
      // Parameters:
      //   binding:
      //     The binding with which to make calls to the service.
      //
      //   remoteAddress:
      //     The address of the service endpoint.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The binding is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      protected ClientBase(Binding binding, EndpointAddress remoteAddress);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the specified callback service and endpoint configuration information.
      //
      // Parameters:
      //   callbackInstance:
      //     The callback object that the client uses to listen for messages from the
      //     connected service.
      //
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The callback instance is null.
      //
      //   System.ArgumentNullException:
      //     The endpoint is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class using the specified target address and endpoint information.
      //
      // Parameters:
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      //   remoteAddress:
      //     The address of the service.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The endpoint is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(string endpointConfigurationName, EndpointAddress remoteAddress);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class.
      //
      // Parameters:
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      //   remoteAddress:
      //     The address of the service.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The endpoint is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(string endpointConfigurationName, string remoteAddress);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class.
      //
      // Parameters:
      //   callbackInstance:
      //     The callback service.
      //
      //   binding:
      //     The binding with which to call the service.
      //
      //   remoteAddress:
      //     The address of the service endpoint.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The callback instance is null.
      //
      //   System.ArgumentNullException:
      //     The binding is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      protected ClientBase(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class.
      //
      // Parameters:
      //   callbackInstance:
      //     The callback object that the client uses to listen for messages from the
      //     connected service.
      //
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      //   remoteAddress:
      //     The address of the service.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The callback instance is null.
      //
      //   System.ArgumentNullException:
      //     The endpoint is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress);
      //
      // Summary:
      //     Initializes a new instance of the System.ServiceModel.ClientBase&lt;TChannel&gt;
      //     class.
      //
      // Parameters:
      //   callbackInstance:
      //     The callback object that the client uses to listen for messages from the
      //     connected service.
      //
      //   endpointConfigurationName:
      //     The name of the endpoint in the application configuration file.
      //
      //   remoteAddress:
      //     The address of the service.
      //
      // Exceptions:
      //   System.ArgumentNullException:
      //     The callback instance is null.
      //
      //   System.ArgumentNullException:
      //     The endpoint is null.
      //
      //   System.ArgumentNullException:
      //     The remote address is null.
      //
      //   System.InvalidOperationException:
      //     The endpoint cannot be found or the endpoint contract is not valid.
      protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress);
  
      // Summary:
      //     Gets the inner channel used to communicate with the service.
      //
      // Returns:
      //     An implementation of the target service contract interface passed as the
      //     type parameter to the constructor.
      protected TChannel Channel { get; }
      //
      // Summary:
      //     Gets the underlying System.ServiceModel.ChannelFactory&lt;TChannel&gt; object.
      //
      // Returns:
      //     A System.ServiceModel.ChannelFactory&lt;TChannel&gt; object.
      public ChannelFactory&lt;TChannel&gt; ChannelFactory { get; }
      //
      // Summary:
      //     Gets the client credentials used to call an operation.
      //
      // Returns:
      //     Returns a System.ServiceModel.Description.ClientCredentials that represents
      //     the proof of identity presented by the client.
      public ClientCredentials ClientCredentials { get; }
      //
      // Summary:
      //     Gets the target endpoint for the service to which the WCF client can connect.
      //
      // Returns:
      //     The target endpoint.
      public ServiceEndpoint Endpoint { get; }
      //
      // Summary:
      //     Gets the underlying System.ServiceModel.IClientChannel implementation.
      //
      // Returns:
      //     The client channel for the WCF client object.
      public IClientChannel InnerChannel { get; }
      //
      // Summary:
      //     Gets the current state of the System.ServiceModel.ClientBase&lt;TChannel&gt; object.
      //
      // Returns:
      //     The value of the System.ServiceModel.CommunicationState of the object.
      public CommunicationState State { get; }
  
      // Summary:
      //     Causes the System.ServiceModel.ClientBase&lt;TChannel&gt; object to transition
      //     immediately from its current state into the closed state.
      public void Abort();
      //
      // Summary:
      //     Causes the System.ServiceModel.ClientBase&lt;TChannel&gt; object to transition
      //     from its current state into the closed state.
      public void Close();
      //
      // Summary:
      //     Returns a new channel to the service.
      //
      // Returns:
      //     A channel of the type of the service contract.
      protected virtual TChannel CreateChannel();
      //
      // Summary:
      //     Instructs the inner channel to display a user interface if one is required
      //     to initialize the channel prior to using it.
      public void DisplayInitializationUI();
      //
      // Summary:
      //     Replicates the behavior of the default keyword in C#.
      //
      // Type parameters:
      //   T:
      //
      // Returns:
      //     Returns null if T is a reference type and zero if T is a numeric value type.
      protected T GetDefaultValueForInitialization&lt;T&gt;();
      protected void InvokeAsync(ClientBase&lt;TChannel&gt;.BeginOperationDelegate beginOperationDelegate, object[] inValues, ClientBase&lt;TChannel&gt;.EndOperationDelegate endOperationDelegate, SendOrPostCallback operationCompletedCallback, object userState);
      //
      // Summary:
      //     Causes the System.ServiceModel.ClientBase&lt;TChannel&gt; object to transition
      //     from the created state into the opened state.
      public void Open();
  
      // Summary:
      //     A delegate that is used by System.ServiceModel.ClientBase&lt;TChannel&gt;.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)
      //     for calling asynchronous operations on the client.
      //
      // Parameters:
      //   inValues:
      //     The input values to the asynchronous call.
      //
      //   asyncCallback:
      //     Reference to the method to be called when the corresponding asynchronous
      //     operation completes.
      //
      //   state:
      //     An System.Object that lets the client distinguish between different asynchronous
      //     calls. It is made available to the client in the arguments parameter of the
      //     event completion callback.
      //
      // Returns:
      //     The result of the asynchronous call.
      protected delegate IAsyncResult BeginOperationDelegate(object[] inValues, AsyncCallback asyncCallback, object state);
  
      // Summary:
      //     A delegate that is invoked by System.ServiceModel.ClientBase&lt;TChannel&gt;.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)
      //     on successful completion of the call made by System.ServiceModel.ClientBase&lt;TChannel&gt;.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)
      //     to System.ServiceModel.ClientBase&lt;TChannel&gt;.BeginOperationDelegate.
      //
      // Parameters:
      //   result:
      //     The result returned by the call made by System.ServiceModel.ClientBase&lt;TChannel&gt;.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)to
      //     System.ServiceModel.ClientBase&lt;TChannel&gt;.BeginOperationDelegate.
      //
      // Returns:
      //     An array of System.Object that contains the results of the call to the asynchronous
      //     method. The operation may have multiple return values, which are all returned
      //     in this object array.
      protected delegate object[] EndOperationDelegate(IAsyncResult result);
  
      // Summary:
      //     Stores the results from an asynchronous call made by the client.
      protected class InvokeAsyncCompletedEventArgs : AsyncCompletedEventArgs
      {
          // Summary:
          //     Gets the results from an asynchronous call made by the client.
          //
          // Returns:
          //     An array of System.Object that contains the results from an asynchronous
          //     call made by the client.
          public object[] Results { get; }
      }
  }
  </code></pre>
  
  <hr>
  
  <p>I tested again, but this time explicity implementing IDisposable. Now it makes sense</p>
  
  <pre><code>abstract class ATest : IDisposable
  {
      void IDisposable.Dispose()
      {
          throw new NotImplementedException();
      }
  }
  
  class Test : ATest
  {
  }
  </code></pre>
  
  <p>Now, I can't access the Dispose() method when I instantiate the Test Class:</p>
  
  <pre><code>        Test t = new Test();
          t.Dispose();
  </code></pre>