2014-10-30 4 views
0

왜 내가 메서드 내에서 다음 람다를 사용할 수 없습니까? 어떤 상황에서 제네릭 형식을 사용할 수 있습니까?왜 lamba 표현식과 함께 제네릭 형식을 사용할 수 없습니까?

예를 들어 내가 클래스 내에 제네릭을 사용할 수 있다는 것을 알고 :

//Valid 
public class GenericList<T> 
{ 
    void Add(T input) { } 
} 

하지만 난 다음 코드에서 수행 할 수 없습니다

//Not valid 
private void Timer1_Tick(object sender, EventArgs e) 
{ 
    //Edit: 
    //As you can guess this is a timer event and Action is called 
    //only in this scope but possibly more than one time 
    //that's why i though to make it Action method. 

    //In the following line `Τ` is not recognized... 
    Action<List<T>, List<T>> syncLists = (l1, l2) => { ... }; 
} 

는 ** 난 그게 생각하지 않습니다 프레임 워크에만 해당하지만 3.5를 사용하는 경우에만

+2

'T'가 외부 클래스 정의에 정의되어 있습니까? – 2kay

+0

성취하고자하는 것은 무엇입니까? 두 번째 코드 예제에서 'T'가 나타내는 타입은 무엇입니까? generics를 사용하면 결국 형식을 지정해야합니다. 'T'에 대한 유형이 코드에서 어디에 지정됩니까? –

+0

'Timer' 스코프 내에서만 작은 함수를 정의해야합니다. 'T'는 제네릭 타입을 원하기 때문에 클래스가 될 수 있습니다. 아마도 나는 '동적'을 사용할 수는 있지만 바람직하지 않습니다. – CodeArtist

답변

3

형식 시그니처에 TypeParameter를 노출해야합니다 (

).

그렇지 않으면 클라이언트가 메소드의 작동 방식과 수행 할 유형을 지정할 방법이 없습니다.

어떤 상황에 더 적절한 대안 기술, 따라서 클래스 서명의 형식 매개 변수를 노출하는 것입니다 :

public class TestClass<T> { 
    private void Timer1_Tick(object sender, EventArgs e) 
    { 
     Action<List<T>, List<T>> syncLists = (l1, l2) => { ... }; 
    } 
} 
+0

메서드는 이벤트 처리기처럼 보이므로 OP가 일반화 할 수 있다고 생각하지 않습니다. – 2kay

+0

@ 2kay : 이례적인 것처럼 보이지만 그러한 광범위한 분야에서 비즈니스 요구 사항에 대한 정확한 일반 진술을하는 것은 어렵습니다. –

+0

그 일을 통해 나는 무엇을 얻을 수 있습니까? 내 생각은 반복을 피하기 위해 타이머 내부에서 지역 범위 함수를 사용하는 것이 었습니다. 문제는 제네릭 형식 목록을 원하는 및 동적 사용하지 않는 것이 좋습니다. 답변 주셔서 감사합니다 – CodeArtist