неявная реализация внутреннего интерфейса - PullRequest
0 голосов
/ 07 декабря 2018

Когда у меня есть открытый интерфейс

public interface IPub { string Foo { get; set; } }

, тогда я могу реализовать этот интерфейс, либо сделав его явно:

public class CFoo : IPub { string IPub.Foo { get; set; } }

или неявно, используя модификатор public:

public class CFoo : IPub { public string Foo { get; set; } }

.Имеет смысл: модификатор должен быть public, потому что интерфейс public.

Но когда у меня есть внутренний интерфейс

internal interface IInt { string Bar { get; set; } }

, тогда я могу реализовать его только явно:

public class CBar : IInt { string IInt.Bar { get; set; } }

или неявно с модификатором public:

public class CBar : IInt { public string Bar { get; set; } }

, но НЕ с модификатором internal:

public class CBar : IInt { internal string Bar { get; set; } }
// compiler error:
//     'CBar' does not implement interface member 'IInt.Bar'.
//     'CBar.Bar' cannot implement an interface member
//      because it is not public.

Это не имеет смысла.Зачем мне нужен модификатор public, когда интерфейс только internal?Существуют ли какие-либо технические причины, по которым public всегда следует использовать в неявных реализациях интерфейса, или разработчики на C # сделали это по-другому (без необходимости что-либо менять в языке)?

1 Ответ

0 голосов
/ 07 декабря 2018

Модификатор должен быть общедоступным, потому что интерфейс общедоступен.

Хотя это был бы способ его определения: это не то, что компиляторхочет.Для неявной реализации интерфейса (независимо от видимости типа интерфейса) член должен быть объявлен как public, без "ifs", "buts" или "maybes" (однако , реализующий тип ,может быть любого уровня видимости)

Абсолютно разработчики языка могли бы взглянуть на более сложные правила, но: поскольку существует также опция для явной реализации интерфейса, онипо-видимому, не чувствовал, что это необходимо.


В частности, это - §18.6.5 («Сопоставление интерфейса») в спецификации (v5) - выделено мной («I» =тип интерфейса, "M" = член, "S" = тип реализации):

  • Если S содержит объявление явной реализации элемента интерфейса, которая соответствует I и M, тогда этот членреализация IM
  • В противном случае, если S содержит объявление нестатического открытого члена , соответствующего M, то этот член является реализацией IM. Если совпадает несколько элементовs, не определено, какой элемент является реализацией IM. Эта ситуация может возникнуть, только если S является составным типом, где два члена, объявленные в универсальном типе, имеют разные сигнатуры, но аргументы типа делают их сигнатуры идентичными.
...