개체를 값 유형으로 캐스팅할 때 C# unboxing 예외를 해결하는 가장 좋은 방법은 무엇입니까?
문제
방금 코드 조각을 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를 변환할 수 없는 경우 예외를 발생시키는 것이 더 나을 수도 있습니다.또 다른 옵션...
제휴하지 않습니다 StackOverflow