If you have a class
public class Pair<T1, T2> { ... }
then you can declare a method
IEnumerable<Pair<int, string>> GetPairs();
i.e. a method that returns an enumerable of pairs where each pair consists of an int and a string.
Usage:
foreach (Pair<int, string> pair in GetPairs()) { ... }
You can also deeply nest these:
IEnumerable<Pair<int, Pair<string, string>>> GetPairs();
i.e. a method that returns an enumerable of pairs where each pair consists of an int and a pair of two strings.
This works with generics as well:
IEnumerable<Pair<T1, T2>> GetPairs<T1, T2>();
i.e. a method that returns an enumerable of pairs where each pair consists of a T1 and a T2.
But you cannot do this:
IEnumerable<T<T1, T2>> GetGenericPairs<T, T1, T2>();