Обновить * Мне очень жаль ... мой пример кода содержал ошибку, из-за которой я не понял многих ответов. Вместо
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.
Итак, здесь два вопроса:
true
? Equals
, чтобы он возвращал true
?