Update * Мне очень жаль... мой пример кода содержал ошибку, которая привела к множеству ответов, которые я не понял. Вместо
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()
будет использовать метод StringBuilder Equals(). И, как я показал, метод StringBuilder Equal() возвращает true
.
Я даже пробовал
public bool Equals(T value) {
return EqualityComparer<T>.Default.Equals(Value, value);
}
но также возвращает false.
Итак, здесь есть два вопроса:
- Почему код не возвращается
true
? - Как я мог реализовать метод
Equals
, чтобы он возвращалtrue
?