문제

첫째, 두 가지 예 :

// This works
int foo = 43;
long lFoo = foo;

// This doesn't
object foo = (int)43;
long? nullFoo = foo as long?; // returns null
long lFoo = (long)foo; // throws InvalidCastException
if (foo.GetType() == typeof(int))
    Console.WriteLine("But foo is an int..."); // This gets written out

이제 두 번째가 작동하지 않는 이유에 대한 내 추측은 권투 때문입니다. 이 코드의 목적은 구현하는 것입니다 IComparable. 나는 오류를 던지는 것보다 객체를 길거나 ulong으로 강요하거나 오류를 던지는 것보다 객체를 강요하는 방법이 필요합니다. 나는 각 기본 숫자 유형 (바이트, int, long, ubyte, ...)에 대한 점검을 구현하고 싶지 않습니다. 여기 모든 똑똑한 사람들의 생각? 객체를 Unbox를 Unbox, 바람직하게는 반사를 피할 수는 있지만 그것이 유일한 방법이라고 생각합니다. IComparable?

편집하다:

이것은 작동하는 것처럼 보이지만 문제에 대한 끔찍한 해킹처럼 보입니다. 나 뿐인가요?

long lFoo = long.Parse(foo.ToString());
도움이 되었습니까?

해결책

object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);

다른 팁

값 유형으로 캐스팅 할 때는 실제로 Unbox IL 작업을 강요하므로 캐스팅하는 유형이 일치해야합니다. 바로 그거죠 박스 값; 동시에 일어날 수있는 전환, 암시 적 또는 명시 적은 없습니다.

이는 일반적으로 TypeCode (또는 IF/Else 유형을 사용하는 경우)를 사용하여 스위치를 수행해야하거나 귀하의 경우에는 NULL을 확인한 다음 Convert.Toint64 ()를 확인하여 처리해야합니다. 바르게.

당신뿐만 아니라 TryParse는 예외를 제기하지 않습니다.

object foo = (int)43;
long outVal;
if(long.TryParse(foo.ToString(),out outVal))
{
//take action with correct value of long
}
else
{
//maybe passed you another type of object
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top