2010-06-16 5 views
3

일반 속성을 사용하여 Session에서 'long'값을 가져 왔는데 충돌이 발생했습니다. C#에서 긴 개체를 캐스팅 할 수 있습니까?

그래서 내가 가진 :

public static T Get<T>(string key) 
{ 
    if(...) 
     return (T)System.Web.HttpContext.Current.Session[key]; 

    ... 
} 

디버깅, 값은 4이며,이 충돌합니다.

+3

길다는 것은 int이고 int가 아닌가? 그러면 캐스팅이 중단됩니다. GetType()을 호출합니다. 값의 이름으로 항목의 실제 유형을 봅니다. – SWeko

+0

예 해당 int 값은 4입니다. (위 참조) – Blankman

+0

왜 4를 길게 캐스트 할 수 없는지 저는 이해가 가지 않습니다? – Blankman

답변

8

, 당신은 Convert.ChangeType()를 사용할 수 있습니다

long n = Get<long>("sessionkey"); 
: 전화를 할 수

public static T Get<T>(string key) 
{ 
    if (...) 
     return 
      (T) Convert.ChangeType(System.Web.HttpContext.Current.Session[key], 
           typeof(T)); 

    ... 
} 

그러나 조심하십시오 : 모든 변환에 대해 Convert.ChangeType()이 작동하지 않습니다. 어디에 문제가

+0

정확하게 작동하지 않는 것은 무엇입니까? 그래서 기본적으로 Session의 값에 대한 일반적인 getter는 모든 유형에서 '안전하게'수행 될 수 없습니다. – Blankman

+0

한 유형에서 다른 유형으로 변환 할 수있는 경우 Convert.ChangeType()이 작동합니다. 그러나 문자열을 int로 변환하면 작동하지 않습니다. 설명서는 http://msdn.microsoft.com/en-us/library/dtb69x08.aspx –

+0

에서 찾을 수 있지만 int로 변환하는 문자열은 Convert에서 작동합니다.ToInt32 ("23"); 나는이 물건을 얻지 못한다. – Blankman

6

사용 Convert.ToInt64

당신이 당신의 일반적인 방법을 유지를 주장하는 경우
2

그래서, 여기에 : 당신은 (세션에있는 동안) 당신이 긴에 그것을 언 박싱하려고하는 객체로 박스있어 소수 (100m)을했고,이 곳이다

그 일은 팬을 때렸다. 변경에만 참조 인 경우,

개체의 값이 절대로 변경되지 여기
object o="string"; 
string s=(string) o 

, 그것이 예전의 "문자열": .NET에서

캐스트 연산자는 실제로 두 가지를 수행합니다. 그러나, 내가 할 때 실제로 물건의 본질을 변경하고

double d= 3.7; 
long l = (long) x; 

에서, dl이 같은 표현이없는, 하나는 3.7의 값을 부동 소수점 이중 폭이며, 다른 하나는 값이 3 인 64 비트 정수입니다.

.net 연산자는이 두 가지를 모두 수행 할 수 있지만 동시에 처리하지 않을 수도 있습니다.

decimal d=4m; 
object o = d; 
long l1 = (long)o; //blows up, the runtime error you got 
long l2 = (decimal)o; //compile time error 
long l3 = (long)(decimal)o; //first we unbox, then we convert - works 

BTW, 마스터의 뻔뻔한 찢음 (here for more and better explanations)

관련 문제