https://github.com/dotnet/coreclr/.../EqualityComparer.cs:
using System;
using System.Collections.Generic;
internal class GenericEqualityComparer<T> : EqualityComparer<T> where T : IEquatable<T>
{
public override bool Equals(T x, T y)
{
if (x != null)
{
if (y != null) return x.Equals(y);
return false;
}
if (y != null) return false;
return true;
}
public override int GetHashCode(T obj) => obj?.GetHashCode() ?? 0;
// ...
}
Q>>Пример был про то, как вызывается метод констрейнта у экземпляра типа
V>Никак он не вызывается.
V>x.Equals(y) — это метод базового Object
internal struct Foo : IEquatable<Foo>
{
public bool Equals(Foo other)
{
Console.WriteLine("Equals(Foo other)");
return true;
}
public override bool Equals(object obj)
{
Console.WriteLine("Equals(object obj)");
return true;
}
public override int GetHashCode() => 0;
}
internal static class Program
{
private static void Main()
{
var comparer = new GenericEqualityComparer<Foo>();
var x = new Foo();
var y = new Foo();
var equal = comparer.Equals(x, y);
Console.WriteLine(equal);
}
}
V>Тут нечего далее обсуждать. Усё, припыли.