+ return o is int[];
+ }
+
+ public static int TestC ()
+ {
+ int? i = null;
+ if (i is int) {
+ return (int) i;
+ }
+
+ return 3;
+ }
+
+ static bool Check1 (E? e)
+ {
+ return e is Enum;
+ }
+
+ static bool Check2<T> (E e) where T : struct
+ {
+ return e is T;
+ }
+
+ public static int Main ()
+ {
+ if (Foo<int>.Test (3))
+ return 1;
+
+ if (!Foo<int>.Test())
+ return 2;
+
+ // False expected int? != null
+ if (Foo<int?>.TestB())
+ return 3;
+
+ int? i = 0;
+ if (!TestA(i))
+ return 4;
+
+ int[] a = new int[0];
+ if (!TestB(a))
+ return 5;
+
+ if (TestC () != 3)
+ return 6;
+
+ if (Check1 (null))
+ return 7;
+
+ if (!Check1 (E.Item))
+ return 8;
+
+ if (Check2<int> (E.Item))
+ return 9;
+
+ Console.WriteLine ("OK");
+ return 0;