Обновление *
Мне очень жаль ... мой пример кода содержал ошибку, которая привела ко многим ответам, которые я не понял.
Вместо
Console.WriteLine("3. this.Equals " + (go1.Equals(go2)));
Я хотел написать
Console.WriteLine("3. this.Equals " + (go1.Equals(sb2)));
Я пытаюсь понять, как я могу успешно определить, равны ли два значения универсального типа друг другу. Основываясь на ответе Марка Байерса на этот вопрос Я думаю, я могу просто использовать value.Equals()
, где значение является универсальным типом.
Моя настоящая проблема в реализации LinkedList, но проблему можно показать на этом более простом примере.
class GenericOjbect<T> {
public T Value { get; private set; }
public GenericOjbect(T value) {
Value = value;
}
public bool Equals(T value) {
return (Value.Equals(value));
}
}
Теперь я определяю экземпляр GenericObject<StringBuilder>
, содержащий new StringBuilder("StackOverflow")
. Я ожидаю получить true
, если я вызову Equals(new StringBuilder("StackOverflow")
для этого экземпляра GenericObject, но я получу false
.
Пример программы, показывающей это:
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<StringBuilder>(sb1);
var go2 = new GenericOjbect<StringBuilder>(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
. Я думаю, что третье и четвертое сравнение на самом деле делают то же самое.
Я бы ожидал true
. Потому что в методе Equals () класса GenericObject оба типа value
и Value
имеют тип T
, который в данном случае равен StringBuilder
. Исходя из ответа Марка Байерса в на этот вопрос , я ожидал, что метод Value.Equals()
будет использовать метод Equals () StringBuilder. И, как я показал, метод Equal () в StringBuilder возвращает true
.
Я даже пытался
public bool Equals(T value) {
return EqualityComparer<T>.Default.Equals(Value, value);
}
но это также возвращает ложь.
Итак, два вопроса здесь:
- Почему код не возвращает
true
?
- Как я могу реализовать метод
Equals
, чтобы он возвращал true
?