2015-01-25 1 views
2

Я читал в основных принципов программирования конечно, что enum значения должны быть уникальными, имеющие следующий пример:Должны ли значения Enum быть уникальными в глобальном масштабе?

enum color = { red, orange, yellow }; 
enum fruit = { apple, orange, kiwi}; // error: orange is redefined 
int kiwi = 42; // error: kiwi is redefined 

Я также нашел ту же идею, по этому вопросу: Two enums have some elements in common, why does this produce an error?

Имена Enum находятся в глобальном масштабе, они должны быть уникальными.


Я пишу C# приложений в MonoDevelop на Ubuntu 14.10, и я попытался воспроизвести это поведение:

using System; 

namespace FP 
{ 
    class MainClass 
    { 
     enum color { red, orange, yellow }; 
     enum fruit { apple, orange, kiwi}; // error: orange is redefined 
     int kiwi = 42; // error: kiwi is redefined 
     public static void Main (string[] args) 
     { 
      Console.WriteLine ("Hello World!"); 
     } 
    } 
} 

Программа выше компилируется успешно.

Это известное поведение MonoDevelop или почему оно было скомпилировано без ошибок? Должны ли значения Enum быть уникальными в глобальной области?

+2

Вопрос, который вы связываете, является вопросом 'c', а не вопросом' C# '. * Основы программирования * говорят о c или C#? – HugoRune

+0

@HugoRune О, мы изучаем C#, но, конечно, курс C. Извините за путаницу. –

+0

кстати. В C++ 11 был введен «класс enum» для устранения этого и других недостатков перечислений стиля C. – CodesInChaos

ответ

5

Что вы говорите, это поведение языка c.

В c# перечисления не доступны по всему миру, вы всегда можете получить к ним доступ по адресу typeName.valueName, например. color.Orange, fruit.Orange. Таким образом, конфликта не будет. Фактически многие встроенные перечисления используют одинаковые имена значений (StringSplitOptions.None, CompareOptions.None).

+0

* enum color = {красный, оранжевый, желтый}; * не является допустимым синтаксисом Си, поэтому его не должно быть C. – ouah

+1

Да, действительный синтаксис C - это цвет enum (красный, оранжевый, желтый); '(нет' = 'токена) – ouah

+0

@ouah Вы правы. Я полностью забыл, что '='. – CodesInChaos

2

Нет, это не ошибка, так как C# должен работать. Вопрос, с которым вы связаны, - это C, а не C#.

В C все значения перечисления должны быть уникальными, так как вы можете использовать значение без указания того, какое перечисление оно принадлежит. Вот почему пример в этом вопросе не был скомпилирован.

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

Значения перечисления, как правило, уникальны, это происходит с попыткой сделать идентификаторы дескриптивными. Если вы используете одно и то же имя для значений в разных перечислениях, то для этого есть причина. Либо перечисления тесно связаны, что они перекрываются по смыслу, либо есть слово с более чем одним значением.