2 using System.Collections.Generic;
9 public static int field = 123;
12 public class GenA<T> {
15 public static GenA () {
21 public GenA<T> newGen () {
22 return new GenA<T> ();
25 public GenA<int> newGenInt () {
26 return new GenA<int> ();
29 public int getGenField () {
30 return GenB<ClassA>.field;
33 public int getNonGenField () {
37 public T[] getArr () {
41 public T[] newArr () {
45 public GenB<GenB<T>>[] newArrNested () {
47 GenB<GenB<T>>[] arr = null;
48 for (int i = 0; i < 10000000; ++i)
49 arr = new GenB<GenB<T>> [3];
51 return new GenB<GenB<T>> [3];
54 public int hash (T obj) {
55 return obj.GetHashCode ();
58 public T ident (T obj) {
62 public T cast (Object obj) {
67 public class GenB<T> {
68 public static int field = 345;
72 static bool haveError = false;
74 public static void error (string message) {
76 Console.WriteLine (message);
79 public static void typeCheck (String method, Object obj, Type t) {
80 if (obj.GetType () != t)
81 error ("object from " + method + " should have type " + t.ToString () + " but has type " + obj.GetType ().ToString ());
84 public static void work<T> (T obj) {
85 EqualityComparer<T> comp = EqualityComparer<T>.Default;
87 GenA<T> ga = new GenA<T> ();
89 typeCheck ("newGen", ga.newGen (), typeof (GenA<T>));
90 typeCheck ("newGenInt", ga.newGenInt (), typeof (GenA<int>));
91 typeCheck ("getArr", ga.getArr (), typeof (T[]));
92 typeCheck ("newArr", ga.newArr (), typeof (T[]));
94 typeCheck ("newArrNested", ga.newArrNested (), typeof (GenB<GenB<T>>[]));
96 if (ga.getGenField () != 345)
97 error ("getGenField");
99 if (ga.getNonGenField () != 123)
100 error ("getNonGenField");
104 if (!comp.Equals (ga.ident (obj), obj))
107 if (!comp.Equals (ga.cast (obj), obj))
111 public static int Main ()
113 work<ClassA> (new ClassA ());
114 work<ClassB> (new ClassB ());
115 work<ClassC> (new ClassC ());
116 work<GenA<ClassA>> (new GenA<ClassA> ());
117 work<int[]> (new int[3]);