C # nullable int를 int로 변환하는 방법


484

nullable int을 로 변환하는 방법은 int무엇입니까? 아래와 같이 2 가지 유형의 int가 있다고 가정하십시오.

int? v1;  
int v2; 

v1값 을 지정하고 싶습니다 v2. v2 = v1;오류가 발생합니다. 로 변환 v1하려면 어떻게합니까 v2?


때 원하는 동작 v1null무엇입니까?
Solomon Ucko

답변:


637

지금까지의 다른 답변은 모두 정확합니다. 약간 더 깨끗한 것을 하나 더 추가하고 싶었습니다.

v2 = v1 ?? default(int);

모든이 Nullable<T>의에 암시 적으로 변환입니다 T평가되는 전체 표현식이 치 형에 null이 할당 될 수 없다는 제공. 따라서 null 병합 연산자 ??는 삼항 연산자의 구문 설탕 일뿐입니다.

v2 = v1 == null ? default(int) : v1;

... if / else의 구문 설탕입니다.

if(v1==null)
   v2 = default(int);
else
   v2 = v1;

또한 .NET 4.0 Nullable<T>부터는 "GetValueOrDefault ()"메소드가 있습니다.이 메소드는 기본적으로 위에 표시된 널 병합을 수행하는 널 안전 게터이므로 작동합니다.

v2 = v1.GetValueOrDefault();

4
되어 default(int)정말 필요? 간단한 문제는 무엇입니까 0?
Cole Johnson

4
이 예제에서는 효과가 있지만 일반적으로 default적절한 경우 사용 하는 것이 좋습니다 . 0은 항상 기본값으로 사용되는 값으로 유효하지는 않으므로 int제네릭으로 바꾸면 T코드가 작동하지만 0은 작동하지 않습니다. 향후 일부 프레임 워크 버전에서는 default오버로드 될 수도 있습니다. 이러한 경우가 발생하면 default를 사용하는 코드를 쉽게 활용할 수 있지만 명시 적 null 또는 zero 할당은 변경해야합니다.
KeithS

5
.NET 4.0, Nullable <T>에는 "GetValueOrDefault ()"가 있습니다.
RandomHandle

GetValueOrDefault로 다시 편집 해 주셔서 감사합니다!
CindyH

기본값을 사용할 때 DateTime에주의해야 할 수 있습니다. 빈 날짜 대신 기본 날짜를 삽입 할 수 있습니다.
Ranch Camal


92

값 속성을 사용하여 할당 할 수 있습니다.

v2 = v1.Value;

8
또한 v1에 null이 있는지 확실하지 않은 경우 null 병합 연산자를 사용하여 폴백 값을 설정할 수 있습니다. 예 : v2 = v1 ?? 0;
Arjen

12
v1.HasValue먼저 확인하십시오 .

3
MSDNv1is 인 경우 예외가 발생한다고 말합니다 null. 제 생각에는 이것이 정답이 아닙니다.
ventiseis

6
@ventiseis 나는 그것이 바람직한 행동이라고 생각할 것입니다. 널을 0으로 자동 변환하는 것에 대해 다른 많은 대답이 괜찮습니다. 널 입력 가능 유형을 널 입력 불가능 유형에 할당하는 경우, 값은 실제로 null이 아닙니다. OP는 "v1을 v2에 할당하고 싶거나 v1이 null 인 경우 0을 지정하고 싶다"고 말하지 않았지만 모든 사람들이 가정 한 것입니다
Michael Mrozek

82

당신이 필요한 건

v2= v1.GetValueOrDefault();

49

v1값 이 있다는 것을 알고 있다면 다음 Value속성을 사용할 수 있습니다 .

v2 = v1.Value;

GetValueOrDefault메소드를 사용하면 값이있는 경우 값을 지정하고, 그렇지 않으면 유형의 기본값 또는 지정한 기본값을 지정합니다.

v2 = v1.GetValueOrDefault(); // assigns zero if v1 has no value

v2 = v1.GetValueOrDefault(-1); // assigns -1 if v1 has no value

HasValue속성을 사용하여 v1값이 있는지 확인할 수 있습니다 .

if (v1.HasValue) {
  v2 = v1.Value;
}

GetValueOrDefault(T)메소드에 대한 언어 지원도 있습니다 .

v2 = v1 ?? -1;

값이 있는지 먼저 확인하지 않고 값을 사용해서는 안됩니다. 사용 ?? 대신 연산자.
피터


28

GetValueOrDefault()

객체의 값을 검색합니다. null의 경우, 디폴트 값 int (0)를 돌려줍니다.

예:

v2= v1.GetValueOrDefault();


21

주어진 유형의 기본값이 허용 가능한 결과 인 경우 :

if (v1.HasValue)
    v2 = v1.GetValueOrDefault();

결과가 정의되지 않은 경우 다른 기본값을 원할 경우 :

v2 = v1.GetValueOrDefault(255);    // or any valid value for int in place of 255

메소드가 실패했는지 여부에 관계없이 값을 리턴하려는 경우 :

v2 = v1.GetValueOrDefault();


.NET 4.7.2 .: GetValueOrDefault()검사하지 않고 필드 값을 반환합니다.


15

내가 염려하는 한 가장 좋은 해결책은 GetValueOrDefault()방법을 사용 하는 것입니다.

v2 = v1.GetValueOrDefault();

이것은 나에게 가장 유용했다
Liakat


10

그것은 가능하다 v2 = Convert.ToInt32(v1);


이것은 기술적으로 작동하지만 HasValue / Value 또는 GetValueOrDefault와 같은 다른 기술은 훨씬 효율적으로 실행됩니다.
Brandon Barkley


9

보다 큰 값의 도메인을 가지기 때문에 v1와 사이의 간단한 변환 v2이 불가능합니다 . 모든 것이 더할 수있는 상태입니다. 변환하려면 상태 를 매핑하는 데 사용될 값을 명시 적으로 명시해야합니다 . 가장 간단한 방법은 연산자입니다.v1v2v1nullintnull??

v2 = v1 ?? 0;  // maps null of v1 to 0

이것은 긴 형식으로도 수행 할 수 있습니다

int v2;
if (v1.HasValue) {
  v2 = v1.Value;
} else {
  v2 = 0;
}

9

사용 컨텍스트에 따라 C # 7의 패턴 일치 기능을 사용할 수 있습니다.

int? v1 = 100;
if (v1 is int v2)
{
    Console.WriteLine($"I'm not nullable anymore: {v2}");
}

편집하다:

어떤 사람들은 설명을 남기지 않고 하향 투표를하고 있기 때문에, 이것을 실용적인 솔루션으로 포함시키는 이유를 설명하기 위해 세부 사항을 추가하고 싶습니다.

  • C # 7의 패턴 일치 를 통해 값 유형을 확인하고 암시 적으로 캐스트 할 수 있습니다. 위의 스 니펫에서 if-condition은에 저장된 값 v1이에 대한 유형과 호환되는 경우에만 전달됩니다 ( v2이 경우에는) int. 의 값 v1null인 경우 null을에 할당 할 수 없으므로 if 조건이 실패합니다 int. 더 적절하게 null는 아닙니다 int.

  • 이 솔루션이 항상 최적의 선택은 아니라는 점을 강조하고 싶습니다. 내가 제안했듯이, 이것이 개발자의 정확한 사용 상황에 달려 있다고 생각합니다. 할당 된 값이 null이 아닌 경우 이미 int?값을 가지고 조건부로 값을 처리하려는 경우 (이것은 정보를 잃지 않고 nullable int를 일반 int로 변환하는 것이 안전 할 유일한 시간입니다) 패턴 매칭은 아마도 가장 간결한 방법 중 하나 일 것입니다.


새 변수 이름을 도입해야하는 것은 유감 스럽지만 실수로 HasValue수표를 리팩토링 할 위험이 없으므로 기본값이 없으면 이것이 가장 안전한 솔루션 입니다.
minexew

v1.HasValue를 확인으로 사용하고 v1.Value를 사용하여 기본 값에 액세스하는 것 보다이 방법의 이점을 보지 못했습니다. 나는 그것을 내려 놓지 않을 것이지만, 나는이 문제가 이미 해결되었고 새로운 기술이 문제에 대해 명확성을 추가하지 않는다고 생각합니다. 또한 8-9 % 느리게 벤치마킹했습니다.
Brandon Barkley

벤치마킹 해 주셔서 감사합니다. 당신이 그것을 보는 어느 쪽이든, 그 차이는 기껏해야 한계가 있습니다 (내가 생각하는 중요한 영역에서 이것을하지 않는 한). API 대신 언어로 구워진 구문 설탕에 의존하기 때문에 이것이 더 "간결한"또는 "아이디 오마 틱"인 것으로 본다. 약간 주관적이지만 아마도 "더 유지 관리 가능"할 것입니다. 실제로, 나는 많은 다른 답변이 제안하는 것처럼 기본값에 의존하는 것 보다이 접근법을 더 좋아합니다.
Nicholas Miller

3

그것은 값 할당 할 v1로를 v2null가 아닌 경우 다른 사람이 0으로 기본 값을 취할 것입니다.

v2=v1??0

또는 아래에 그것을 쓰는 다른 방법이 있습니다.

v2 = v1.HasValue?v1:0


-1
 int v2= Int32.Parse(v1.ToString());

5
이 코드는 질문에 대답 할 수 있지만,이 코드가 질문에 응답하는 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
xiawi

1
언더 핸드 트릭을 사용하는 대신 옵션을 풀려면 "모범 사례"방법을 사용하는 것이 좋습니다. 참조 docs.microsoft.com/en-us/dotnet/csharp/language-reference/... 참조 용
LORG

15 개의 기존 답변으로 8 살짜리 질문에 답변 할 때는 답변의 새로운 측면을 설명하고 시간의 경과에 따라 답변이 바뀌 었는지 확인하는 것이 중요합니다. 코드 만 답변은 설명을 추가함으로써 거의 항상 향상 될 수 있습니다.
Jason Aller
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.