Несоответствие равенства TypeDelegator?

Рассмотрим следующий код:

    class MyType : TypeDelegator
    {
       public MyType(Type parent)
          : base(parent)
       {
       }
    }

    class Program
    {
       static void Main(string[] args)
       {
          Type t1 = typeof(string);
          Type t2 = new MyType(typeof(string));

          Console.WriteLine(EqualityComparer<Type>.Default.Equals(t1, t2)); // <-- false
          Console.WriteLine(EqualityComparer<Type>.Default.Equals(t2, t1)); // <-- true

          Console.WriteLine(t1.Equals(t2)); // <-- true
          Console.WriteLine(t2.Equals(t1)); // <-- true

          Console.WriteLine(Object.Equals(t1, t2)); // <-- false
          Console.WriteLine(Object.Equals(t2, t1)); // <-- true
       }
   }

Почему разные версии Equals возвращают разные результаты? EqualityComparer.Default, вероятно, вызывает Object.Equals, поэтому эти результаты совпадают, хотя и несовместимы сами по себе. И нормальный экземпляр версия Equals возвращает true .

Это, очевидно, создает проблемы, когда метод возвращает Type , который фактически наследуется от TypeDelegator . Представьте себе, например, размещение этих типов в качестве ключей в словаре, который по умолчанию использует EqualityComparer.Default для сравнения.

Есть ли способ решить эту проблему? Я хотел бы, чтобы все методы в приведенном выше коде возвращали true .

22
задан DeCaf 3 October 2011 в 09:34
поделиться