using System.Runtime.CompilerServices; namespace System.Collections.Generic { partial class EqualityComparer { static volatile EqualityComparer defaultComparer; public static EqualityComparer Default { [MethodImplAttribute (MethodImplOptions.AggressiveInlining)] get { EqualityComparer comparer = defaultComparer; if (comparer == null) { comparer = CreateComparer(); defaultComparer = comparer; } return comparer; } } static EqualityComparer CreateComparer () { RuntimeType t = (RuntimeType)typeof(T); if (t == typeof(byte)) { return (EqualityComparer)(object)(new ByteEqualityComparer()); } ///////////////////////////////////////////////// // KEEP THIS IN SYNC WITH THE DEVIRT CODE // IN METHOD-TO-IR.C ///////////////////////////////////////////////// if (typeof(IEquatable).IsAssignableFrom(t)) { return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(GenericEqualityComparer<>), t); } if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) { RuntimeType u = (RuntimeType)t.GetGenericArguments()[0]; if (typeof(IEquatable<>).MakeGenericType(u).IsAssignableFrom(u)) { return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(NullableEqualityComparer<>), u); } } if (t.IsEnum) { return (EqualityComparer)RuntimeType.CreateInstanceForAnotherGenericParameter (typeof(EnumEqualityComparer<>), t); } return new ObjectEqualityComparer(); } // MONOTODO: Add specialized versions internal virtual int IndexOf (T[] array, T value, int startIndex, int count) { int endIndex = startIndex + count; for (int i = startIndex; i < endIndex; i++) { if (Equals (array[i], value)) return i; } return -1; } internal virtual int LastIndexOf (T[] array, T value, int startIndex, int count) { int endIndex = startIndex - count + 1; for (int i = startIndex; i >= endIndex; i--) { if (Equals (array[i], value)) return i; } return -1; } } partial class EnumEqualityComparer { [MethodImpl (MethodImplOptions.AggressiveInlining)] public override bool Equals (T x, T y) => JitHelpers.EnumEquals (x, y); } }