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