개체를 값 유형으로 캐스팅할 때 C# unboxing 예외를 해결하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1153612

  •  18-09-2019
  •  | 
  •  

문제

방금 코드 조각을 VB.NET에서 C#으로 변환했는데 우연히 이 문제를 발견했습니다.

다음 코드를 고려해보세요:

    Dim x As Integer = 5
    Dim y As Object = x
    Dim z As Decimal = CType(y, Decimal)

컴파일러나 런타임에 오류가 없습니다.z는 5입니다.

이제 이 코드를 C#으로 변환해 보겠습니다.

    int x = 5;
    object y = x;
    decimal z = (decimal)y;

컴파일러에서는 오류가 발생하지 않지만 런타임 시 예외가 발생합니다.

    Cannot unbox "y" to "decimal"

이제 제 질문은 이 작업을 수행하는 가장 현명한 C# 방법이 무엇인지입니다.

현재 내 코드는 다음과 같습니다.

    int x = 5;
    object y = x;
    decimal z = decimal.Parse(y.ToString());

그러나 또 다른 해결책은 다음과 같습니다.

    decimal z = (decimal)(int)y;

약간 혼란스러워 보이지만 아마도 십진수보다 오버헤드가 적을 것입니다. 구문 분석인 것 같습니다.

도움이 되었습니까?

해결책

(decimal)(int)x 박스형 객체가 정수가 될 것으로 기대하는 경우 올바른 방법입니다. 문자열과 구문 분석으로 변환하는 것은 문제를 공격하는 좋은 방법이 아니며 일부 오버 헤드가 발생합니다.

단지 객체를 변환 할 수 있다는 것을 알고 있다면 decimal 어떤 식 으로든 시도하십시오 System.Convert.ToDecimal 방법. 그것은 당신을 위해 그것을 처리 할 것입니다.

다른 팁

어때요 :

z = Convert.ToDecimal(y);

conver.todecimal (y);

완전히 안전해지기를 원한다면 다음을 시도해 볼 수 있습니다.

    int x = 5;
    object y = x;
    decimal z;
    if (Decimal.TryParse(y.ToString(), out z))
    {
        // z is a decimal
    }
    else
    {
        // z is not a decimal
    }

이렇게 하면 누군가 y를 = "donkey"로 설정하면 예외를 발생시키지 않고 처리할 수 있습니다.물론 z를 변환할 수 없는 경우 예외를 발생시키는 것이 더 나을 수도 있습니다.또 다른 옵션...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top