2011-03-05 4 views
3

이것은 기본적인 질문 일 수 있지만 값 형식 목록을 일반 메서드로 전달할 때 원래 형식을 다시 원래 형식으로 캐스팅 할 수없는 이유는 무엇입니까? T에 아무런 제약이 없기 때문에제네릭 형식을 값 형식으로 캐스팅 할 수없는 이유는 무엇입니까?

가, 두 번째 오류가 첫 번째 오류로

Inverse<Person>(new List<Person>()); 

같은 것을 방지하기 위해

IList<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8 }; 
Inverse<int>(list); 

    public void Inverse<T>(IList<T> list) 
     { 
      for (i = 0; i <= list.Count/2; i++) 
      { 
       int a = list[i] as Int16; //=> does not work 
       int b = (int)list[i]; //=> does not work either 

      } 
     } 

답변

6

IList의 유형이 'int'라고 가정 할 때 일반 메소드의 요점을 완전히 놓쳤습니다. 당신이 한 경우

:

T a = (T)list[i]

는 그것을 작동합니다.

2

글쎄 , as은 참조 유형에 대한 작업을하지 않기 T는 더있다 다시 때문에 컴파일러는 아무 것도 추론 할 수 없습니다.

0

Int16 (short)은 값 형식이므로 개체 참조를 캐스팅하려고하므로 Int16 (으)로 사용할 수 없습니다. 그러나 당신의 디자인은 generics의 요점을 놓치기도합니다 : 당신은 정수를 기대하지만 일반적인 방법을 사용합니다. 그래서 T는 정말로 아무것도 될 수 있습니다.

1

잘못하고 있습니다. Inverse는 int가 아닌 모든 유형의 T를 허용합니다. 컴파일러는 &의 종류를 알 수 없기 때문이다

int b = (int)list[i]; 

1
int b = Convert.ToInt32(list[i]); 

대신 T와 INT의 선두로부터 교체, 따라서 그것을 컴파일러 오류가 발생합니다. 형식 유추와 함께 C# 4에서 작동하는지 확실하지 않습니다.

편집 : http://msdn.microsoft.com/en-us/library/cscsdfbt.aspx

:

(가) 연산자로 호환 참조 사이의 전환 특정 유형을 수행 할 수 유형

참조를 사용하기 때문에 as 문은 귀하의 예제에서 작동하지 않을 수 있습니다

+0

나는 Convert를 추천하지 않겠다. 이 경우 개체의 ToString을 호출 한 다음 구문 분석합니다. 그리고 모자 T가 숨길 수 있다는 것을 알지 못합니다. – Euphoric

관련 문제