web-dev-qa-db-ja.com

列挙型をnullに設定する方法

列挙型があります

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

ロード時にNULLに設定する方法。

name = "";
Color color = null; //error

編集:私の悪い、私はそれを適切に説明しませんでした。しかし、nullableに関連するすべての答えは完璧です。私の状況は、名前などのような他の要素を持つクラスの列挙型の取得/設定がある場合です。ページの読み込み時にクラスを初期化し、値をnullにデフォルト設定しようとします。シナリオは次のとおりです(コードはC#です)。

namespace Testing
{
    public enum ValidColors
    {
        Red,
        Green,
        Yellow
    }

    public class EnumTest
    {
        private string name;
        private ValidColors myColor;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public ValidColors MyColor
        {
            get { return myColor; }
            set { myColor = value; }
        }

    }

    public partial class _Default : System.Web.UI.Page
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            EnumTest oEnumTest = new EnumTest();
            oEnumTest.Name = "";
            oEnumTest.MyColor = null; //???
        }
    }

}

次に、以下の提案を使用して、上記のコードを変更してgetおよびsetメソッドで動作するようにしました。 「?」を追加するだけですプライベート列挙型変数の宣言中のEnumTestクラス内およびget/setメソッド内:

public class EnumTest
{
    private string name;
    private ValidColors? myColor; //added "?" here in declaration and in get/set method

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public ValidColors? MyColor
    {
        get { return myColor; }
        set { myColor = value; }
    }

}

素敵な提案をありがとう。

161
Sri Reddy

「?」を使用できますnull許容型の演算子。

public Color? myColor = null;

または、enumの最初の値(別名0)をデフォルト値にすることで、nullにできないenumの標準的な手法を使用します。たとえば、色がNoneの場合。

public Color myColor = Color.None;
324
Rodney S. Foley

これがC#の場合、機能しません。列挙型は値型であり、nullにはできません。

通常のオプションは、Noneメンバーを追加することです。

public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

...またはNullableを使用するには:

Color? color = null;
40
Tim Robinson

変数をヌル可能にします。のような:

Color? color = null;

または

Nullable<Color> color = null;
19
Cj S.

列挙型は、C#の「値」型です(つまり、列挙型は、値自体が格納されているメモリ内の場所への参照としてではなく、値として格納されます)。値型をnullに設定することはできません(nullは参照型にのみ使用されるため)。

つまり、組み込みのNullable<T>クラスを使用すると、値の型をラップしてnullに設定し、HasValueかどうかを確認して、実際のValueを取得できます。 (これらは両方ともNullable<T>オブジェクトのメソッドです。

name = "";
Nullable<Color> color = null; //This will work.

使用できるショートカットもあります。

Color? color = null;

それはNullable<Color>と同じです。

8
Crisfole

ここではC++を想定しています。 C#を使用している場合、答えはおそらく同じですが、構文は少し異なります。 enumはint値のセットです。オブジェクトではないため、nullに設定しないでください。何かをnullに設定するということは、オブジェクトを指すポインターをポイントしてゼロをアドレス指定することを意味します。あなたは本当にintでそれを行うことはできません。 intでやりたいことは、通常は持っていない値に設定することです。そうすれば、値が適切かどうかをtelに伝えることができます。したがって、色を-1に設定します

Color color = -1;

または、1からenumを開始し、ゼロに設定できます。現在のように色をゼロに設定すると、列挙型で赤がゼロになるため、「赤」に設定されます。

そう、

enum Color {
red =1
blue,
green
}
//red is 1, blue is 2, green is 3
Color mycolour = 0;
4
Rokujolady