using System;
using System.Collections.Generic;

namespace Test
{
	internal struct TestClass4<T> : IEquatable<TestClass4<T>>, IEquatable<T>, IEqualityComparer<TestClass4<T>> where T : class
	{
		public bool Equals (T obj)
		{
			return true;
		}

		public bool Equals (TestClass4<T> entry)
		{
			return true;
		}

		public bool Equals (TestClass4<T> x, TestClass4<T> y)
		{
			return x.Equals (y);
		}

		public int GetHashCode (TestClass4<T> obj)
		{
			return obj.GetHashCode ();
		}

		public override int GetHashCode ()
		{
			return 1;
		}

		public override bool Equals (object obj)
		{
			return false;
		}

		public static bool operator == (TestClass4<T> entry1, TestClass4<T> entry2)
		{
			return entry1.Equals (entry2);
		}

		public static bool operator == (T entry1, TestClass4<T> entry2)
		{
			return entry2.Equals (entry1);
		}

		public static bool operator == (TestClass4<T> entry1, T entry2)
		{
			return entry1.Equals (entry2);
		}

		public static bool operator == (object entry1, TestClass4<T> entry2)
		{
			return entry2.Equals (entry1);
		}

		public static bool operator == (TestClass4<T> entry1, object entry2)
		{
			return entry1.Equals (entry2);
		}

		public static bool operator != (TestClass4<T> entry1, TestClass4<T> entry2)
		{
			return !(entry1 == entry2);
		}

		public static bool operator != (T entry1, TestClass4<T> entry2)
		{
			return !(entry1 == entry2);
		}

		public static bool operator != (TestClass4<T> entry1, T entry2)
		{
			return !(entry1 == entry2);
		}

		public static bool operator != (object entry1, TestClass4<T> entry2)
		{
			return !(entry1 == entry2);
		}

		public static bool operator != (TestClass4<T> entry1, object entry2)
		{
			return !(entry1 == entry2);
		}
	}

	class C
	{
		public static void Main ()
		{
			new TestClass4<string> ();
		}
	}
}