Возвращаем Enum из получателей C # Property - PullRequest
2 голосов
/ 19 июня 2009

Как вы возвращаете Enum из функции установки / получения?

В настоящее время у меня есть это:

    public enum LowerCase
    {
        a,
        b,
    }
    public enum UpperCase
    {
        A,
        B,
    }

    public enum Case
    {
        Upper,
        Lower,
    }

    private Enum _Case;
    private Enum _ChosenCase;


    public Enum ChooseCase
    {
        get
        {
            if ('Condition')
            {
                return LowerCase; //[need to return LowerCase]
            }
            else
            {
                return UpperCase; //[need to return UpperCase]
            }
        }
        set
        {
            _ChosenCase = value; 
        }
    }

Когда я пытаюсь запустить это, я получаю сообщение об ошибке:

LowerCase является «типом», но используется как «переменная»

Любые идеи, что мне нужно сделать, чтобы вернуть перечисление ????

Я тоже не очень уверен в том, чтобы установить значение в данный момент.

Если кто-нибудь может дать общий совет, я был бы признателен; большинство людей должно видеть, что я пытаюсь сделать.

Большое спасибо.

[Последнее редактирование]

Во-первых, спасибо всем, кто ответил.

В попытке упростить этот вопрос, похоже, я использовал неправильную аналогию прописных / строчных букв, а некоторые из вас ошиблись - явно не ваша ошибка:)

Это код, который у меня есть, и позволяет выбирать между ChoiceOne и ChoiceTwo

    public partial class CustomControl1 : Control
    {
    public enum ChoiceOne
    {
        SubChoiceA,
        SubChoiceB,
    }
    public enum ChoiceTwo
    {
        SubChoiceC,
        SubChoiceD,
    }
    public enum Choice
    {
        ChoiceOne,
        ChoiceTwo,
    }

    private Type _subChoice;
    private Choice _choice;

    public Type SetSubChoice
    {
        get
        {
            if (_choice.Equals(Choice.ChoiceOne))
            {
                return typeof(ChoiceOne); 
            }
            else
            {
                return typeof(ChoiceTwo);
            }
        }
        set
        {
            _subChoice = value; 
        }
    }

    public Choice SetChoice
    {
        get
        {
            return _choice;
        }
        set
        {
            _choice = value;
        }
    }      
    }

Что радует в VisualStudio, так это то, что сетка свойств позволяет вам устанавливать свойство SetChoice между ChoiceOne и ChoiceTwo, что является правильным.

Проблема в том, что свойство SetSubChoice неактивно, но для него задано либо «WindowsFormsApplication4.CustomControl1 + ChoiceOne», либо «WindowsFormsApplication4.CustomControl1 + ChoiceTwo», в зависимости от того, для чего установлено SetChoice. Я хочу иметь возможность использовать SetSubChoice для выбора SubChoiceA или SubChoiceB или SubChoiceC или SubChoiceD в зависимости от того, какой SetChoice установлен.

Так, например, если SetChoice установлен на ChoiceOne, то SetSubChoice позволит мне выбирать между ChoiceA или ChoiceB. Аналогично, если SetChoice установлен в ChoiceTwo, то SetSubChoice позволит мне выбирать между ChoiceC или ChoiceD.

Надеюсь, это прояснило ситуацию немного подробнее?

Мы почти у цели :) Продолжайте в том же духе.

Спасибо

Ответы [ 7 ]

14 голосов
/ 19 июня 2009

Похоже, что вы хотите:

public Case ChooseCase
{
    get { return 'Condition' ? Case.Lower : Case.Upper; }
}

Или я полностью упустил суть?

3 голосов
/ 19 июня 2009

Ошибка правильная. Это в основном то же самое, что делать это

public int ChooseCase
{
    get{ return int; }
}

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

public abstract class Case
{
    public abstract string ModifyString(string value);
}

public class UpperCase : Case
{
    public override string ModifyString( string value )
    { 
        return String.ToUpper( value ); 
    }
}
2 голосов
/ 19 июня 2009

Я думаю, вы могли неправильно понять причины использования перечислений. Перечисление - это особый тип переменной, который может принимать только определенный набор значений. Например. логическое значение - это особый случай перечисления. Логическая переменная - это переменная, которая может принимать только 2 значения: либо «true», либо «false».

Вы определили перечисление:

public enum LowerCase
    {
        a,
        b,
    }

Это означает, что переменная типа LowerCase может быть установлена ​​только в a или b. Это не очень много пользы.

Ваше другое перечисление более разумно:

public enum Case
    {
        Upper,
        Lower,
    }
Для переменной типа Case может быть задано либо «Upper», либо «Lower». Теперь, когда вы определяете переменную типа перечисления, вы указываете тип, которым вы хотите, чтобы он был. Вы сделали это:
private Enum case;
, но вы думаете, что имеете в виду:
private Case case;
Это определяет личную переменную типа Case, которая называется case. Ключевое слово enum используется только при определении нового перечисления, а не при определении переменной типа перечисления.

Точно так же, когда вы определили свое свойство, вы должны использовать тип перечисления, который вы хотите вернуть:

public Case ChooseCase
{...
А если вы пытаетесь вернуть значение перечисления, вы должны сделать это:
return Case.Lower
2 голосов
/ 19 июня 2009

Вы смешиваете два перечисления вместе, что не очень хорошая идея, так как это побеждает цель перечисления.

Определенно, не приводите к int и выполняйте сравнения таким образом - вы теряете возможность изменять порядок перечисляемых значений в будущих версиях.

1 голос
/ 19 июня 2009

Использовать типы ... т.е. ..


public Type ChooseCase{
    get{ return typeof(Uppercase); }
}

0 голосов
/ 19 июня 2009

Возможно, вам следует использовать базовый класс Case и два производных класса, чтобы ваше свойство ChooseCase возвращало объект соответствующего класса:

abstract class Case
{
    abstract char GetItem(int index);
}

class LowerCase : Case
{
    override char GetItem(int index)
    {
        // Not sure for the following
        Encoding ascii = Encoding.ASCII;
        return ascii.GetString(ascii.GetBytes("a")[0] + index)[0];
    }
}

class UpperCase : Case
{
    // The same for the upper case
}

public Case ChooseCase
{
    get
    {
        if (condition)
        {
            return new LowerCase();
        }
        else
        {
            return new UpperCase();
        }
    }
}

Это то, что вы не можете сделать с перечислениями, потому что все они происходят именно от Enum.

0 голосов
/ 19 июня 2009

Эта ошибка выдается, потому что LowerCase является типом. Представьте, что вы пытаетесь написать это утверждение.

return Int32;

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

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