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


191

列挙型があります

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

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

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

編集:私の悪い、私はそれを適切に説明しませんでした。しかし、nullableに関連するすべての答えは完璧です。私の状況は、名前などの他の要素を持つクラスの列挙型のget / setがある場合です。ページの読み込み時に、クラスを初期化し、値をデフォルトで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; }
    }

}

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


回答:


370

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

public Color? myColor = null;

または、列挙型の最初の値(別名0)をデフォルト値としてnullにできない列挙型の標準的な方法を使用します。例えば、色なしの場合。

public Color myColor = Color.None;

タイプは左側に指定されているため、@ equimanをキャストする必要はありません。基本的に、既に受け入れられている私の回答の最初の部分を複製しています。
Rodney S. Foley、

7
これが私の質問に回答しました:Ca n't add '?' それをnull可能にするために列挙型に?
LuckyLikey

クラスでnull許容型が既に宣言されており、ここに来る場合:myColor =(Color?)null;
StefanJanssen

@StefanJanssen宣言済みのnull許容型のColorであるmyColor = nullで十分な場合は、nullをキャストする必要はありません。
ロドニーS.フォーリー

そのときは何が問題なのかはわかりませんが、私のコンパイラでは、キャストするまでエラーが発生しました。
StefanJanssen

43

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

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

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

Color color = Color.None;

...または使用するNullable

Color? color = null;

24

変数をヌル可能にします。お気に入り:

Color? color = null;

または

Nullable<Color> color = null;

9

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

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

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

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

Color? color = null;

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


3

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

Color color = -1;

または、enumを1から開始してゼロに設定することもできます。現在の色をゼロに設定すると、列挙型では赤がゼロであるため、「赤」に設定します。

そう、

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

0

値0をNone 定数に明示的に割り当てる方が良いでしょうか?どうして?

デフォルトenum値は0であるため、呼び出すdefault(Color)場合はprintになりますNone

最初の位置にあるため、リテラル値0を他の定数に割り当てるとその動作が変更され、発生の順序を変更するとdefault(Color)https://stackoverflow.com/a/4967673/8611327)の出力が変更されます


-2
Color? color = null;

またはあなたが使うことができます

Color? color = new Color?();

nullの割り当てが機能しない例

color = x == 5 ? Color.Red : x == 9 ? Color.Black : null ; 

だからあなたは使うことができます:

 color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.