using System.Console; struct Foo { } class C[T] { public class D { static public x : T; public y : T; } public static y : D = D (); public static Test () : void { WriteLine (D.x); } public class X[Q] { static public x : T * Q; public this () { WriteLine ($ "$(typeof(T)) $(typeof(Q))"); } public static Test () : void { WriteLine (y.y) } } } // _ = null : C.D[int]; _ = null : C[int].D; // _ = null : C.D.[int]; _ = null : C.[int].D; WriteLine (C[int].D.x); // WriteLine (C.D[int].x); WriteLine (C[int].X[Foo].x); // WriteLine (C.X[int, Foo].x); WriteLine (C.[int].X.[Foo].x); // WriteLine (C.X.[int, Foo].x); WriteLine (C[Foo].y.y); C[Foo].X[string].Test (); C[Foo].Test (); _ = C.X.[int, string] (); _ = C[int].X.[int, string] (); _ = C[int].X.[string] (); _ = C[int].X (); /* BEGIN-OUTPUT 0 (0, Foo) (0, Foo) Foo Foo Foo System.Int32 System.String System.Int32 System.String System.Int32 System.String System.Int32 System.Object END-OUTPUT */