2014-10-30 1 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' должен представлять в вашем втором примере кода? В случае дженериков вы должны указать типы. Где будут указаны типы для 'T' в вашем коде? –

+0

Мне нужно определить небольшую функцию только внутри области «Таймер». 'T' может быть любым классом, так как я хочу общий тип. Вероятно, я мог бы использовать 'dynamic', но не предпочтительнее. – CodeArtist

ответ

3

Вам необходимо разоблачить TypeParameter в методе, например:

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

В противном случае клиент не может указать, как должен себя вести метод, и на какой тип следует действовать.

Альтернативный метод, более подходящим в некоторых обстоятельствах, было бы выставить тип параметра в классе подписи, таким образом:

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