Члены типа интерфейса всегда общедоступны. Что требует, чтобы реализация их метода была публичной. Это не компилируется, например:
interface IFoo { void Bar(); }
class Baz : IFoo {
private void Bar() { } // CS0737
}
Явная реализация интерфейса предоставляет синтаксис, который позволяет методу быть закрытым:
class Baz : IFoo {
void IFoo.Bar() { } // No error
}
Классическое использование для этого - скрыть реализацию базового типа интерфейса. IEnumerable <> был бы очень хорошим примером:
class Baz : IEnumerable<Foo> {
public IEnumerator<Foo> GetEnumerator() {}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { }
}
Обратите внимание, как доступна универсальная версия, неуниверсальная версия скрыта. Это препятствует его использованию и позволяет избежать ошибки компиляции из-за дублированного метода.
В вашем случае реализация Dispose () явно неверна. Вы написали Dispose (), чтобы позволить клиентскому коду вызывать его, заставляя приводить его к IDisposable, чтобы сделать вызов не имеет смысла.
Кроме того, вызов Dispose () из финализатора является запахом кода. Стандартный шаблон - добавить в ваш класс защищенный метод Dispose (удаление в bool).