2009-08-18 6 views
6

지금까지 제네릭을 통해 Type 매개 변수를 사용하는 이유, 즉 있는가 contravarience 및 covarience뿐만 아니라 아마도 내가 모르는 몇 가지 다른 기능. 일반 형식에는 모든 장점이 있으며 첫 번째 항목도 공유하지 않는 제외 항목이없는 것으로 보입니다. 그래서, 대신에 첫 번째를 사용하는 경우가 있습니까?유형 매개 변수 대 제네릭

답변

8

절대적으로 : 실행 시간까지 유형을 알지 못할 때. 예를 들어 :

foreach (Type t in someAssembly.GetTypes()) 
{ 
    Foo(t); 
} 

Foo 제네릭 때 엉덩이에 통증이 있다고 이렇게. 그것은 가능하지만 고통 스럽습니다.

매개 변수가 null 인 경우도 있습니다. 일부 상황에서 유용 할 수 있습니다.

+0

- 고통이 나에게 일반적으로 더 중요하지만 :) –

+2

을 절대적으로 제네릭 함께 할 수도 많이 비싸고 느린 –

0

글쎄 그들은 실제로 전혀 같지 않습니다.

두 번째로, 실제로 컴파일 타임 유형의 클래스를 얻었습니다 (다른 사람이 전달한 것). 따라서 특정 함수를 호출 할 수 있습니다 (주어진 인터페이스가 모두있는 경우).

첫 번째 예에서는 '유형'클래스의 개체가 있습니다. 그러므로 당신은 여전히 ​​그것이 무엇인지를 결정하고 그것으로 무엇이든 할 수있는 캐스트를 할 필요가 있습니다.

그것은 (모든 반사 호출이 꽤 될 수 없음)
+0

정확히, 두 번째 형태는 모두가 컴파일 타임 검사의 이점. 그래서, 다른 것들 중에서도, 제가 첫 번째 이유를 사용해야 할 이유가 있는지 알고 싶었습니다. 나는 그것들이 다르다는 것을 알지만, 다른 것은 하나의 형식이 다른 것에 대한 필요를 완전히 포함하지 않는다는 것을 의미하지는 않습니다. –

+0

글쎄요, 요점은 두 번째 것보다 완전히 다른 목적으로 첫 번째 것을 사용하는 것입니다. 동일한 메소드 (예 : 공통 메소드 호출 또는 주어진 클래스 유형에 대한 '일반'조치 수행)에 대해서는 절대 사용하지 않을 것입니다. –

1
Foo(someVariable.GetType());  // allowed 

Foo<someVariable.GetType()>(); // illegal 
+0

나는 그것이 존의 요점이라고 생각한다. –