Это называется явная реализация интерфейса . В вашем примере, поскольку вы определяете метод Dispose () как «void IDisposable.Dispose ()», вы также явно реализуете интерфейс IDisposable.
Обычно это делается для того, чтобы избежать столкновений. Если бы Microsoft когда-либо захотела добавить другой метод Dispose (), который сделал бы что-то еще с RegistryKey, они бы не смогли, если бы не использовали явную реализацию этого интерфейса.
Это часто делается с помощью универсального интерфейса IEnumerable . Требуется также реализовать неуниверсальный интерфейс IEnumerable. Единственный член в этих двух интерфейсах - это GetEnumerator, более универсальный из которых более полезен, поэтому его обычно реализуют так:
public clas SomeClass : IEnumerable<SomeOtherClass>
{
public IEnumerator<SomeOtherClass> GetEnumerator ()
{
...
}
IEnumerator IEnumerable.GetEnumerator ()
{
return GetEnumerator ();
}
}
Таким образом, когда вы вызываете объект метода SomeClass GetEnumator, он вызывает универсальную версию, так как другая была реализована явно, что позволяет нам получать разрешенные дженерики строгой типизации.
См. Страницы 166-169 из Программирование на C # Джесси Либерти (у меня четвертое издание).