Почему метод Equals возвращает другой результат из общего метода? Я думаю, что здесь есть какой-то автоматический бокс, который я не понимаю.
Вот пример, который воспроизводит поведение с .net 3.5 или 4.0:
static void Main(string[] args)
{
TimeZoneInfo tzOne = TimeZoneInfo.Local;
TimeZoneInfo tzTwo = TimeZoneInfo.FindSystemTimeZoneById(tzOne.StandardName);
Console.WriteLine(Compare(tzOne, tzTwo));
Console.WriteLine(tzOne.Equals(tzTwo));
}
private static Boolean Compare<T>(T x, T y)
{
if (x != null)
{
return x.Equals(y);
}
return y == null;
}
Вывод:
False
True
Изменить: Этот код работает без каких-либо компромиссов:
private static Boolean Compare<T>(T x, T y)
{
if (x != null)
{
if (x is IEquatable<T>)
{
return (x as IEquatable<T>).Equals(y);
}
return x.Equals(y);
}
return y == null;
}
Followup: я подал ошибку через MS Connect и был исправлен как исправленный, поэтому это возможно будут исправлены в следующей версии .NET Framework. Если они станут доступными, я обновляю их подробнее.
PS: это, по-видимому, исправлено в .net 4.0 и более поздних версиях (смотря на разборку TimeZoneInfo в mscorlib).