Информация об изменениях

Сообщение Без слов от 10.01.2017 12:51

Изменено 10.01.2017 13:35 Qbit86

Re[29]: Без слов
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()
    {
        return 0;
    }
}

internal static class Program
{
    private static void Main(string[] args)
    {
        var comparer = new GenericEqualityComparer<Foo>();
        var x = new Foo();
        var y = new Foo();
        var equal = comparer.Equals(x, y);
    }
}


V>Тут нечего далее обсуждать. Усё, припыли.


Без слов
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>Тут нечего далее обсуждать. Усё, припыли.