열거 형을 null로 설정하는 방법


194

나는 열거 형이있다

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; }
    }

}

멋진 제안에 감사드립니다.


답변:


374

"?"를 사용할 수 있습니다 널 입력 가능 유형의 연산자.

public Color? myColor = null;

또는 열거 형의 FIRST 값 (일명 0)을 기본값으로하여 널이 될 수없는 열거 형의 표준 사례를 사용하십시오. 예를 들어 색상 없음의 경우.

public Color myColor = Color.None;

@equiman 유형이 왼쪽에 지정되어 있기 때문에 캐스팅 할 필요가 없습니다. 기본적으로 이미 받아 들여진 내 답변의 첫 부분을 복제합니다.
Rodney S. Foley

7
이것은 내 질문에 대답했습니다 : '?'를 추가 할 수 있습니까? nullable로 enumname?
LuckyLikey

클래스에서 이미 nullable 형식을 선언하고 여기에 오는 사람들을 위해 : myColor = (Color?) null;
StefanJanssen '

@StefanJanssen 이미 선언 된 nullable 유형의 Color 만 myColor = null이면 null을 캐스팅 할 필요가 없습니다.
Rodney S. Foley

그때 문제가 무엇인지 모르지만 내 컴파일러의 경우 캐스팅을 수행 할 때까지 오류가 발생했습니다.
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

열거 형은 C #에서 "값"유형입니다 (열거는 값 자체가 저장된 메모리의 위치에 대한 참조가 아니라 임의의 값으로 저장됨을 의미합니다). 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로 설정하면 주소가 0 인 객체를 가리키는 포인터를 의미합니다. 실제로 int로는 그렇게 할 수 없습니다. int로하고 싶은 것은 좋은 가치인지 아닌지에 대해 전화를 걸 수 있도록 일반적으로 가지고 있지 않은 값으로 설정하는 것입니다. 따라서 색상을 -1로 설정하십시오.

Color color = -1;

또는 열거 형을 1에서 시작하여 0으로 설정할 수 있습니다. 지금과 같이 색상을 0으로 설정하면 열거 형에서 빨간색이 0이므로 "빨간색"으로 설정됩니다.

그래서,

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.