I don’t understand what is going on here…
I’ve got the following error:
The type 'TestApp.TestVal' cannot be used as type parameter 'T' in the generic type or method 'TestApp.SomeClass<T>'. There is no boxing conversion from 'TestApp.TestVal' to 'System.IComparable<TestApp.TestVal>'.
This error happens for the following code:
public enum TestVal
{
First,
Second,
Third
}
public class SomeClass<T>
where T : IComparable<T>
{
public T Stored
{
get
{
return storedval;
}
set
{
storedval = value;
}
}
private T storedval;
}
class Program
{
static void Main(string[] args)
{
//Error is on the next line
SomeClass<TestVal> t = new SomeClass<TestVal>();
}
}
Since the enum is an int by default and int’s implement the IComparable<int> interface it seems like there shouldn’t be an error….
Firstly, I’m not sure whether it is sensible to use
IComparable<T>with an enum…IEquatable<T>, sure – but comparison?As a safer alternative; rather than mandate the
IComparable<T>with the generic constraint, perhaps useComparer<T>.Defaultinside the class. This has the advantage of supportingIComparable<T>andIComparable– and it means you have less constraints to propagate.For example:
This works fine with the enum: