Рассмотрим следующий код:
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
.