return tc.Kind == Kind.Interface;
}
- public static bool IsEqualGenericType (Type a, Type b)
- {
- if ((a is TypeBuilder) && a.IsGenericTypeDefinition && b.IsGenericInstance) {
- //
- // `a' is a generic type definition's TypeBuilder and `b' is a
- // generic instance of the same type.
- //
- // Example:
- //
- // class Stack<T>
- // {
- // void Test (Stack<T> stack) { }
- // }
- //
- // The first argument of `Test' will be the generic instance
- // "Stack<!0>" - which is the same type than the "Stack" TypeBuilder.
- //
- if (a != b.GetGenericTypeDefinition ())
- return false;
-
- Type[] aparams = a.GetGenericArguments ();
- Type[] bparams = b.GetGenericArguments ();
-
- if (aparams.Length != bparams.Length)
- return false;
-
- for (int i = 0; i < aparams.Length; i++)
- if (!aparams [i].Equals (bparams [i]))
- return false;
-
- return true;
- }
-
- return false;
- }
-
public static bool IsEqual (Type a, Type b)
{
if (a.Equals (b))
// The first argument of `Test' will be the generic instance
// "Stack<!0>" - which is the same type than the "Stack" TypeBuilder.
//
+ //
+ // We hit this via Closure.Filter() for gen-82.cs.
+ //
if (a != b.GetGenericTypeDefinition ())
return false;
return false;
for (int i = 0; i < aparams.Length; i++)
- if (!aparams [i].Equals (bparams [i]))
+ if (!IsEqual (aparams [i], bparams [i]))
return false;
return true;
}
if (a.IsGenericParameter && b.IsGenericParameter) {
- if ((a.DeclaringMethod != null) != (b.DeclaringMethod != null))
+ if ((a.DeclaringMethod == null) || (b.DeclaringMethod == null))
return false;
return a.GenericParameterPosition == b.GenericParameterPosition;
}
+ if (a.IsArray && b.IsArray) {
+ if (a.GetArrayRank () != b.GetArrayRank ())
+ return false;
+ return IsEqual (a.GetElementType (), b.GetElementType ());
+ }
+
if (a.IsGenericInstance && b.IsGenericInstance) {
Type at = a.GetGenericTypeDefinition ();
Type bt = b.GetGenericTypeDefinition ();