Подтвердить что ты не робот

Круговое определение в постоянном перечислении

Я пытаюсь создать константу типа Enum, но я получаю сообщение об ошибке.. Мое перечисление:

public enum ActivityStatus
{
    Open = 1,
    Close = 2
}

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

public class CreateActivity
{
    public int Id;
    public const ActivityStatus ActivityStatus = ActivityStatus.Open;
}

возникает следующая ошибка:

Ошибка 1 Оценка постоянного значения для "Help_Desk.Models.CreateActivity.ActivityStatus" включает в себя круговое определение...

Но если я изменю имя свойства ActivityStatus, это сработает!

public class CreateActivity
{
    public int Id;
    public const ActivityStatus AnyOtherName = ActivityStatus.Open;
}

Почему это происходит?

4b9b3361

Ответ 1

Потому что компилятор С# intepretes третий ActivityStatus в:

public const ActivityStatus ActivityStatus = ActivityStatus.Open; 

как имя определяемой константы, а не имя перечисления - следовательно, круговая ссылка: вы определяете константу в терминах самой константы.

В С# вы можете использовать одно и то же имя для членов и типов и обычно разрешать неоднозначность, определяющую полные имена (например, добавление пространства имен), но по моему опыту это не очень хорошая идея, это делает код запутанным: компилятор может выяснить, что есть, но плохой человек, читающий код, не может понять, относится ли какое-либо имя к классу, типу или члену.

Ответ 2

Вам не следует создавать переменную с тем же именем класса или перечисления.

Возможно, он будет работать, если вы укажете пространство имен, например:

public class CreateActivity
{
    public int Id;
    public const TheNamespace.ActivityStatus ActivityStatus =
        TheNamespace.ActivityStatus.ActivityStatus.Open;
}

Ответ 3

Если используется только личное использование: вы можете изменить ActivityStatus на поле только для чтения и перенести настройку значения по умолчанию в конструктор.

Если публичное использование: вы можете использовать свойство только с геттером.

В большинстве анализаторов кода дополнительное пространство имен будет рассматриваться как избыточность в вашем коде.