2012-04-20 2 views
3

Явно реализованные свойства интерфейса обычно начинаются с полного имени интерфейса. Однако, если это вложенный интерфейс, имя свойства будет немного несоответствием.Разница между полным именем интерфейса и явно реализованным его свойством

namespace NS 
{ 
    public class Container 
    { 
     //FullName is NS.Container+ITest 
     public interface ITest 
     { 
      int Prop { get; } 
     } 
    } 

    public class Sample : Container.ITest 
    { 
     //Property's name is NS.Container.ITest.Prop 
     int Container.ITest.Prop { get; } 
    } 
} 

Почему имя собственности не NS.Container+ITest.Prop? Или интерфейс лучше будет называться NS.Container.ITest. Это было бы более правильно, не так ли?

+0

Ваш код не компилируется. – SLaks

+0

@SLaks спасибо, исправлено. – lorond

+2

@Lorond: Теперь я не вижу вашего вопроса. – SLaks

ответ

2

Имена типов, которые генерирует CLR, просто не соответствуют соглашениям об именах языка C#. Канонический пример: List<int>, имя типа CLR будет напоминать List'1 (backquote). Что не является допустимым идентификатором типа в C#, так же как и NS.Container + ITest.

Вы должны использовать соглашения об именах C# в коде C#.

+0

Я знаю, что они не соответствуют соглашениям об именах. Мне просто интересно, существуют ли какие-либо другие соглашения об именах для этих случаев. Как '+' в 'NS.Container + ITest' говорит нам, что' ITest' принадлежит классу или структуре с именем 'Container'. Или частная собственность 'NS.ITest.Prop' сообщит нам, что это явная реализация свойства' Prop' для интерфейса 'NS.ITest'. Это просто для размышлений. Я никогда не думал использовать такие имена в своем коде. :) – lorond

+1

Их много, включая имена, которые сам компилятор C# генерирует для типов, явно не созданных в вашем коде. Как ламды и итераторы. Листинг их все кажется пустой тратой времени, учитывая вероятность, что я, возможно, пропустил один. Думаю, я не совсем понимаю суть вопроса. –

+0

Точка зрения есть '.' В имени свойства 'NS.Container.ITest.Prop' вместо' + ', как будто это имя интерфейса (' NS.Container + ITest'). Я ожидал имя NS.Container + ITest.Prop для свойства и был удивлен, что он немного отличается. – lorond

0

Если вы предположили, что NS.Container+ITest указывает, что ITest является вложенным классом под NS.Container, тогда NS.Container+ITest.Prop будет членом интерфейса. Но реализация Prop является членом Sample (который явно реализует интерфейс), который соответствует имени NS.Container.ITest.Prop. Попытка доступа к члену интерфейса невозможна, поэтому разрешение имени, соответствующего реализации, кажется разумным.

+0

Я не вижу логики, почему Prop, являющийся членом Sample, будет соответствовать этому имени. Обычно явно введенное имя имени совпадения имени имени принадлежит ему. – lorond

Смежные вопросы