Как определить, есть ли два значения универсального типа равны?

Обновить * Мне очень жаль ... мой пример кода содержал ошибку, из-за которой я не понял многих ответов. Вместо

Console.WriteLine("3. this.Equals   " + (go1.Equals(go2)));

я хотел написать

Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));

Я пытаюсь понять, как я могу успешно определить, равны ли два значения универсального типа друг другу. Основываясь на ответе Марка Байерса на этот вопрос , я бы подумал, что могу просто использовать value.Equals () , где value - это общий тип. Моя настоящая проблема заключается в реализации LinkedList, но проблему можно показать на этом более простом примере.

class GenericOjbect {
    public T Value { get; private set; }
    public GenericOjbect(T value) {
        Value = value;
    }
    public bool Equals(T value) {
        return (Value.Equals(value));
    }
}

Теперь я определяю экземпляр GenericObject , содержащий new StringBuilder ("StackOverflow") . Я ожидаю получить true , если я вызову Equals (new StringBuilder ("StackOverflow") в этом экземпляре GenericObject, но я получаю false .

A пример программы, показывающий это:

using System;
using System.Text;

class Program
{
    static void Main()
    {
        var sb1 = new StringBuilder("StackOverflow");
        var sb2 = new StringBuilder("StackOverflow");

        Console.WriteLine("StringBuilder compare");
        Console.WriteLine("1. ==            " + (sb1 == sb2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(sb1, sb2)));
        Console.WriteLine("3. this.Equals   " + (sb1.Equals(sb2)));

        var go1 = new GenericOjbect(sb1);
        var go2 = new GenericOjbect(sb2);

        Console.WriteLine("\nGenericObject compare");
        Console.WriteLine("1. ==            " + (go1 == go2));
        Console.WriteLine("2. Object.Equals " + (Object.Equals(go1, sb2)));
        Console.WriteLine("3. this.Equals   " + (go1.Equals(sb2)));
        Console.WriteLine("4. Value.Equals  " + (go1.Value.Equals(sb2.Value)));
    }
}

Для трех методов сравнения двух объектов StringBuilder только метод экземпляра StringBuilder.Equals (третья строка) возвращает true . Это то, что я ожидал. Но при сравнении GenericObject объектов, его метод Equals () (третья строка) возвращает false . Что интересно, четвертый метод сравнения возвращает true . Я думаю, что третье и четвертое сравнение на самом деле делают то же самое.

Я ожидал истинного . Поскольку в методе Equals () класса GenericObject оба value и Value имеют тип T , который в данном случае является StringBuilder ]. Основываясь на ответе Марка Байерса в на этот вопрос , я ожидал, что метод Value.Equals () будет использовать метод Equals () StringBuilder. И, как я показал, метод Equal () StringBuilder возвращает true .

Я даже пробовал

public bool Equals(T value) {
    return EqualityComparer.Default.Equals(Value, value);
}

, но он также возвращает false.

Итак, здесь два вопроса:

  1. Почему не? t код return true ?
  2. Как я могу реализовать метод Equals , чтобы он возвращал true ?

10
задан Community 23 May 2017 в 12:22
поделиться