interface I { } class X : I { } class X2 { public static void Main () { Foo<I, I> (new X[0]); Foo<X, I> (new X[0]); } static void Foo<T1,T2> (T2[] array) where T1 : class, T2 { T1[] a = (T1[])array; } static void Foo<T1,T2> (T2[][] array) where T1 : class, T2 { T1[][] a = (T1[][])array; } }