Right now Pair<of T> has a strongly typed indexer and enumerable interface:
class Pair<of T> implements IEnumerable<of T>
get [i as int] as T
class Pair<of TA, TB> implements System.Collections.IEnumerable
get [i as int] as dynamic?
I think the strongly typed enumerable could be saved, but not the indexer. Maybe that's okay, but I wanted to point it out. Too bad .NET does not have a concept of "greatest common denominator" for types:
class Pair<of TA, TB> implements System.Collections.IEnumerable
get [i as int] as gcd(TA, TB)
Cobra has such a concept in certain places like when it infers the type of collection literals such as [Square(), Circle()] which would be List<of Shape>. However, using it in return types would be fairly meaningless because run-time construction of .NET generics wouldn't implement it.