**Update\***
I am so sorry... my sample code contained an error which resulted in a lot of answers I didn't understand.
In stead of

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

```

I meant to write

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

```

---

I'm trying to figure out how I can successfully determine if two generic type values are equal to each other. Based on Mark Byers' answer on [this question](https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are) I would think I can just use `value.Equals()` where value is a generic type.
My actual problem is in a LinkedList implementation, but the problem can be shown with this simpler example.

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

```

Now I define an instance of `GenericObject<StringBuilder>` containing `new StringBuilder("StackOverflow")`. I would expect to get `true` if I call `Equals(new StringBuilder("StackOverflow")` on this GenericObject instance, but I get `false`.

A sample program showing this:

```
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)));
    }
}

```

For the three methods of comparing two StringBuilder objects, only the StringBuilder.Equals instance method (the third line) returns `true`. This is what I expected. But when comparing the GenericObject objects, its Equals() method (the third line) returns `false`. Interestingly enough, the fourth compare method *does* return `true`. I'd think the third and fourth comparison are actually doing the same thing.

I would have expected `true`. Because in the Equals() method of the GenericObject class, both `value` and `Value` are of type `T` which in this case is a `StringBuilder`. Based on Mark Byers' answer in [this question](https://stackoverflow.com/questions/3470145/two-net-objects-that-are-equal-dont-say-they-are), I would've expected the `Value.Equals()` method to be using the StringBuilder's Equals() method. And as I've shown, the StringBuilder's Equal() method does return `true`.

I've even tried 

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

```

but that also returns false.

So, two questions here:

1. Why doesn't the code return `true`?
2. How could I implement the `Equals` method so it *does* return `true`?