C# How to make a generic class?

c#, concurrency, generics, operator-overloading

Solution

You need to constrain `T` to be a reference type, like this:

class AtomicReference<T> where T : class {
    private T _value;

    public AtomicReference() { }

    public AtomicReference(T value) {
        OptimisticSet(value);
    }

    public T CompareAndSet(T newValue) {
        return Interlocked.Exchange(ref _value, newValue); 
    }

    public void OptimisticSet(T newValue) {
        while (_value == CompareAndSet(newValue));
    }

    public T Get() {
        return _value;
    }
}

EDIT: I would recommend that you also replace the methods with a property:

public T Value {
    get { return _value; }
    set { while(_value == CompareAndSet(value)); }
}

Problem

How can I make this generic? ``` class AtomicReference { private Object _value; public AtomicReference() { _value = new Object(); } public AtomicReference(Object value) { OptimisticSet(value); } public Object CompareAndSet(Object newValue) { return Interlocked.Exchange(ref _value, newValue); } public void OptimisticSet(Object newValue) { do { } while (_value == Interlocked.CompareExchange(ref _value, _value, newValue)); } public Object Get() { return _value; } } ``` My failed attempt: ``` class AtomicReference<T> { private T _value; public AtomicReference() { } public AtomicReference(T value) { Set(value); } public T CompareAndSet(T newValue) { // _value is not an object that can be referenced return Interlocked.Exchange(ref _value, newValue); } public void OptimisticSet(T newValue) { // I can't use the operator== with type T do{}while(_value == CompareAndSet(newValue)); } public T Get() { return _value; } } ```

Original source