Если вам иногда захочется использовать один интерфейс, а иногда и другой, вероятно, будет необходимо использовать приведение для, наконец, одного из них.Если вы управляете типом и можете иметь одну из функций интерфейса доступной напрямую, а не как явную реализацию, это позволит избежать требования приведения к этой функции.Чтобы избежать необходимости настраивать любую из этих функций, вы должны сделать их доступными под разными именами внутри объекта.Поскольку в C # любой метод, реализующий anyInterface.Boz, должен называться Boz, лучше всего подходить к тому, чтобы реализации IFoo.Boz и IBar.Boz просто вызывали публичные методы с именами FooBoz и BarBoz, которые затем можно было бы вызывать «напрямую» безнеоднозначность.
Несмотря на то, что приведение к интерфейсам обходится недорого для классов, оно может быть дорогим для структур.Эту стоимость в некоторых случаях можно избежать, используя статические методы, подобные следующим:
public interface AliceFoo { void foo();};
public interface BobFoo { void foo();};
static void do_alice_foo<T>(ref T it) where T:AliceFoo
{
it.foo();
}
static void do_bob_foo<T>(ref T it) where T : BobFoo
{
it.foo();
}
Этот подход позволяет использовать любой метод 'foo' без необходимости что-либо вводить.