کامپایلر سعی میکنه type رو حدث بزنه و فقط اگر نتونه شما رو مجبور میکنه اون رو مشخص کنید.
توابع نیز میتوانند مانند کلاسها جنریک باشند و لزوما نباید همان type کلاس معرفشان را استفاده کنند.

    class myclass<T1>
{
public static void Main (string [] args)
{
myclass<int> myints = new myclass<int> ();
myints.permute (new int [] { 3, -6, 9 }, new string [] { "a", "c", "r", "p" });
}
public void permute<T2> (IEnumerable<T1> t1s, IEnumerable<T2> t2s)
{
int index = 0;
foreach (var t1 in t1s) {
foreach (var t2 in t2s) {
Console.WriteLine ("{0} T1:{1} T2:{2}", index++, t1, t2);
}
}
}
}



$ mono ./test.exe 
0 T1:3 T2:a
1 T1:3 T2:c
2 T1:3 T2:r
3 T1:3 T2:p
4 T1:-6 T2:a
5 T1:-6 T2:c
6 T1:-6 T2:r
7 T1:-6 T2:p
8 T1:9 T2:a
9 T1:9 T2:c
10 T1:9 T2:r
11 T1:9 T2:p