If I have a generic interface with a struct
constraint like this:
public interface IStruct<T> where T : struct { }
I can supply an enumeration as my type T
like so, because an enum
satisfies a struct
constraint:
public class EnumIsAStruct : IStruct<DateTimeKind> { }
C# 7.3 added an Enum
constraint. The following code, which was previously illegal, now compiles:
public class MCVE<T> : IStruct<T> where T : struct, Enum { }
However, to my surprise, the following fails to compile:
public class MCVE<T> : IStruct<T> where T : Enum { }
...with the error
CS0453 The type 'T' must be a non-nullable value type in order to use it as parameter 'T' in the generic type or method 'IStruct'
Why is this? I would expect a generic type constrained by Enum
to be usable as a type argument where the type is constrained by struct
but this doesn't seem to be the case - I am having to change my Enum
constraint to struct, Enum
. Is my expectation wrong?