2016-06-02 5 views
0

У меня есть Gender перечисление:Как назвать свойство Gender типа Gender в C# в соответствии с соглашениями об именах?

public enum Gender 
{ 
    Male, 
    Female, 
    Other, 
    Unknown 
} 

Я также Gender свойство внутри Person класса A:

public Gender Gender { get; set; } 

Но я получаю сообщение об ошибке:

The type 'Person' already contains a definition for 'Gender'

Поставив перечисление вне класс решает проблему, но я хочу ее внутри. Я не нашел решения для этой конкретной проблемы в MSDN. Есть ли какое-либо соглашение об именах, которое решает такую ​​проблему?

Примечание: Я не прошу для мнения, я спрашиваю, есть ли хорошо известное именование для такой ситуации.

+0

Как выглядит ваш класс 'Person'? – Ian

+0

Ответ на ваш вопрос: № –

+0

@Ian - Это всего лишь пример ... Я спрашиваю об общей идее. – Sipo

ответ

3

Существует не «соглашение об именах», которое может исправить ваше желание иметь два члена одного типа с тем же именем. Из раздела 10.3 Спецификации языка C#, класс Участники:

• The name of a constant, field, property, event, or type must differ from the names of all other members declared in the same class.

• The name of a method must differ from the names of all other non-methods declared in the same class. In addition, the signature (§3.6) of a method must differ from the signatures of all other methods declared in the same class,

(моего акцент)

Таким образом, вы должны выбрать, чтобы использовать разные имена, или пойти с, по-видимому, уже выброшенными вариантами размещения перечисление вне класса Person. Или, если вы действительно хотите, чтобы инкапсулировать его, возможно инкапсулировать его дальше:

class Person { 
    class Enums { 
     enum Gender { 
     ... 
     } 
     ... 
    } 
    Enums.Gender Gender {get;set;} 
    ... 
} 

Хотя я думаю, что это уродливее.

+2

Определенно уродливо добавить класс (который, вероятно, должен быть 'static') как внутреннее пространство имен. Я всегда хотел бы сделать перечисление не членом: как часть публичного интерфейса он должен (IMHO) в аналогичной области. Внутренние типы предназначены для помощников и деталей реализации. – Richard

1

Для этих случаев нет «хорошо известного соглашения об именах». Такое двусмысленное наименование лучше обрабатывается путем определения типа вне используемого им типа (как указано сообщением об ошибке).

Если тип явно является частью поверхности API типа, кажется странным определить перечисление в качестве члена ,

+0

Спасибо. Не могли бы вы продемонстрировать, как будет работать второе решение? – Sipo

+0

@Sipo 'public namespace.Person.Gender Gender {get; задавать; } ' – Richard

+0

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

1

Как уже было сказано, для таких случаев нет соглашения об именах. Но насколько я помню, рекомендации C# препятствуют вам использовать определения внутреннего типа, когда внутренний класс должен часто обращаться извне. Я бы сказал, что лучше определить GenderEnum в том же пространстве имен. Человек определяется с того момента, когда Пол является общедоступной собственностью Person.

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

  • Нет связанных вопросов^_^