Les génériques types et génériques méthodes sont des choses très différentes. Il semble que vous avez un type générique:
class SomeType<T> {
public void Sample(T someValue) {...}
}
et discutez avec une méthode générique à l'intérieur:
class SomeType<T> {
public void Sample<T>(T someValue) {...}
}
Ce sont très différents. Dans le premier, à l'intérieur Sample
, puis T
signifie "le T
qui s'est passé à SomeType<T>
". Dans la seconde, à l'intérieur Sample
, il s'agit d'un séparé et indépendantT
- "le T
qui a été passé à Sample<T>
". En fait, l'appeler T
(dans ce cas) est une erreur. Vous pourriez avoir, par exemple:
var obj = new SomeType<int>(); // here T for SomeType<T> is int
obj.Sample<decimal>(123.45M); // here T for Sample<T> is decimal
Notez qu'il n'y a aucun moyen facile (au sein Sample<T>
) de dire « T
dans SomeType<T>
» - donc pourquoi vous devez renommer le paramètre de type générique de la méthode.
Il existe des scénarios valides pour ce type de scénario (méthodes génériques sur les types génériques), par exemple (et notez le nouveau nom):
class SomeType<T> {
public void Sample<TActual>(TActual someValue) where TActual : T, new() {...}
}
Cela nous permet de faire des choses très intéressantes en termes de héritage, etc - ou vous pouvez vouloir une méthode générique qui a peu ou pas par rapport à T
. C'est bien aussi.
Voulez-vous dire la classe au lieu de système? – jfar
Pas nécessairement. Peut être déclaré dans cette classe ou ailleurs, juste besoin d'être connu à cet endroit. –