Что ж, поскольку T может быть типом значения, вам нужно сделать что-то вроде этого:
public class SomeClass<T> where T : class
{
internal List<T> InternalList;
public SomeClass() { InternalList = new List<T>(); }
public void RemoveAll(T theValue)
{
// this will work
InternalList.RemoveAll(x => x == theValue);
}
}
Будьте осторожны, хотя просто проверяйте равенство ссылок - это то, что вам действительно нужно.
ОБНОВЛЕНИЕ: я забыл упомянуть об этом изначально, но это, конечно, будет означать, что вы не сможете использовать его для типов значений.В качестве альтернативы можно использовать что-то вроде этого для поддержки обоих типов:
public abstract class SomeCollection<T>
{
internal List<T> InternalList;
public SomeCollection() { InternalList = new List<T>(); }
public abstract void RemoveAll(T theValue);
}
public class ReferenceCollection<T> : SomeCollection<T> where T : class
{
public override void RemoveAll(T theValue)
{
InternalList.RemoveAll(x => x == theValue);
}
}
public class ValueCollection<T> : SomeCollection<T> where T : struct
{
public override void RemoveAll(T theValue)
{
InternalList.RemoveAll(x => x.Equals(theValue));
}
}