Странное ограничение в реализации внутреннего интерфейса - PullRequest
4 голосов
/ 22 сентября 2011

У меня есть код

internal interface IFoo
{
  void foo();
}

public class A : IFoo
{
  // error CS0737: 'A' does not implement interface member 'IFoo.foo()'. 
  //'A.foo()' cannot implement an interface member because it is not public.
  internal void foo()
  {
    Console.WriteLine("A");
  }
}

Почему такое странное ограничение?У меня есть внутренний интерфейс, и почему я не могу создать внутренний метод в реализации интерфейса?

1 Ответ

5 голосов
/ 22 сентября 2011

Это связано с тем, что интерфейсы не могут указывать ничего о видимости элементов, только сами элементы.Все члены, которые реализуют интерфейс, должны быть public.То же самое происходит при реализации интерфейса private.

Одним из решений может быть явная реализация интерфейса:

internal interface IFoo
{
  void foo();
}

public class A : IFoo
{
  void IFoo.foo()
  {
    Console.WriteLine("A");
  }
}

В приведенном выше коде у вас должен быть экземпляр Aприведение к IFoo для возможности вызова foo(), но вы можете выполнять такое приведение, только если вы internal по сравнению с классом и, следовательно, имеете доступ к IFoo.

...