using System; using System.Collections.Generic; using System.Globalization; using System.Text; namespace DerivedEquals { internal sealed class NamedAsciiEncoding : ASCIIEncoding { public readonly string Name; public NamedAsciiEncoding(string name) { Name = name; } public override bool Equals(object obj) { var other = obj as NamedAsciiEncoding; if (other == null) return false; if (!base.Equals(other)) return false; return Name == other.Name; } public override int GetHashCode() { int hash = base.GetHashCode(); if (Name != null) hash ^= Name.GetHashCode(); return hash; } } internal sealed class AnnotatedCultureInfo : CultureInfo { public readonly string Annotation; public AnnotatedCultureInfo(string cultureName, string annotation) : base(cultureName) { Annotation = annotation; } public override bool Equals(object obj) { var other = obj as AnnotatedCultureInfo; if (other == null) return false; if (!base.Equals(other)) return false; return Annotation == other.Annotation; } public override int GetHashCode() { int hash = base.GetHashCode(); if (Annotation != null) hash ^= Annotation.GetHashCode(); return hash; } } internal sealed class ColoredUri : Uri { public readonly string Color; public ColoredUri(string uriString, string color) : base(uriString) { Color = color; } public override bool Equals(object obj) { var other = obj as ColoredUri; if (other == null) return false; if (!base.Equals(other)) return false; return Color == other.Color; } public override int GetHashCode() { int hash = base.GetHashCode(); if (Color != null) hash ^= Color.GetHashCode(); return hash; } } internal static class Program { private static void Main() { var baseAE = new ASCIIEncoding(); var johnDoeAE = new NamedAsciiEncoding("John Doe"); Console.WriteLine(Object.Equals(baseAE, johnDoeAE)); // True Console.WriteLine(Object.Equals(johnDoeAE, baseAE)); // False Console.WriteLine(EqualityComparer.Default.Equals(baseAE, johnDoeAE)); // True Console.WriteLine(EqualityComparer.Default.Equals(johnDoeAE, baseAE)); // False var baseCI = new CultureInfo("da-DK"); var annCI = new AnnotatedCultureInfo("da-DK", "Remember these words!"); Console.WriteLine(Object.Equals(baseCI, annCI)); // True Console.WriteLine(Object.Equals(annCI, baseCI)); // False Console.WriteLine(EqualityComparer.Default.Equals(baseCI, annCI)); // True Console.WriteLine(EqualityComparer.Default.Equals(annCI, baseCI)); // False var baseUri = new Uri("http://www.microsoft.com/"); var greenUri = new ColoredUri("http://www.microsoft.com/", "green"); Console.WriteLine(Object.Equals(baseUri, greenUri)); // True Console.WriteLine(Object.Equals(greenUri, baseUri)); // False Console.WriteLine(EqualityComparer.Default.Equals(baseUri, greenUri)); // True Console.WriteLine(EqualityComparer.Default.Equals(greenUri, baseUri)); // False } } }