Почему мои C # перечисления не работают? - PullRequest
7 голосов
/ 24 декабря 2011

У меня проблемы с перечислениями в C #

У меня есть перечисление здесь:

namespace Project.Shared
{
    public enum CostType
    {
        Dollars,
        Percent
    }
}

У меня есть объект, который пытается использовать перечисление здесь:

using Project.Shared;
namespace Project.Shared.FooNamespace
{
    public class Foo
    {
        public int CostType { get; set; }

        public Foo()
        {

            CostType = (int)CostType.Dollars; // <--- error syntax highlighting on 'Dollars'
        }
    }
}

Это приводит к ошибке:

'int' не содержит определения для 'Dollars', и невозможно найти метод расширения 'Dollars', принимающий первый аргумент типа 'int'(вам не хватает директивы using или ссылки на сборку?)

Я не понимаю, почему я не могу использовать свой enum там.Может кто-нибудь помочь мне это объяснить?

Ответы [ 6 ]

17 голосов
/ 24 декабря 2011

Поскольку у вашего класса Foo есть это определение - public int CostType { get; set; } - которое имеет более локальную область действия, чем ваше enum.

Попробуйте полностью определить его в своем пространстве имен:

CostType = (int)Project.Shared.CostType.Dollars;
12 голосов
/ 24 декабря 2011

Как уже отмечали другие, свойство «ближе», чем тип, и поэтому при разрешении простого имени свойство всегда выигрывает.

Интересная ошибка в этой ситуации заключается в том, что , если бы вы указали свойство типа CostType, а не int, это сработало бы.

Причина этого в том, что в C # есть специальное правило для этой ситуации, обычно называемое правилом «Цветовой цвет». (Потому что именно в такой ситуации он чаще всего возникает: тип с именем Color и свойство с именем Color типа Color.)

Если простое имя может означать как тип , так и свойство или поле с этим именем этого типа , то C # позволяет вам обоим обращаться к статическим элементам через тип и члены экземпляра через свойство. Это позволяет вам делать такие вещи, как:

Color = Color.Red;
description = Color.ToString();

Первый и третий цвета являются ссылками на свойство; вторая ссылка на тип.

1 голос
/ 24 декабря 2011

Измените это на это, и оно должно работать

public enum CostType
{ 
    Dollars,
    Percent 
} 

public class Foo
{         
    public int CostTypes { get; set; }
    public Foo()
    { 
        CostTypes = (int)CostType.Dollars;
        // <--- error syntax highlighting on 'Dollars'
    }
} 

Я бы не назвал свое авто-свойство тем же именем, что и мой enum.

1 голос
/ 24 декабря 2011

Проблема в том, что в CostType = (int)CostType.Dollars; Оба вхождения CostType относятся к переменной.А переменная CostType не имеет свойства с именем Dollars.Включите пространство имен для ссылки на тип Project.Shared.CostType, чтобы явно ссылаться на тип, а не на переменную.

1 голос
/ 24 декабря 2011

У вас конфликт имен.Вы назвали свое свойство CostType, которое совпадает с именем enum.Таким образом, C # предполагает, что обе CostType ссылки в методе Foo() ссылаются на свойство, а не на enum.

Вы можете попробовать это:

CostType = (int)Project.Shared.CostType.Dollars;
0 голосов
/ 10 ноября 2015

Я решил свою ошибку: «ENUM не содержит определения VALUE», перезапустив Visual Studio. На всякий случай, если у кого-то есть такая же проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...