where enum does not work !!!

I was writing a generic method with enum as the Constraint, and the compiler spat a few errors that did not directly convey me that enums cannot used as generic constraints. And I learnt the following from my investigation:

C# language specification for generic constraints

A class-type constraint shall satisfy the following rules:

  • The type shall be a class type.
  • The type shall not be sealed.
  • The type shall not be one of the following: types: System.Array, System.Delegate, System.Enum or System.ValueType.
  • The type shall not the object. [Note: Since all types, derive from object such a constraint would have no effect if it were permitted, end note]
  • At most one constraint for a given type parameter can be a class type.

A type specified as an interface-type constraint shall satisfy the following rules:

  • The type shall be an interface type.

This is an excerpt from the C# Language Specification. Enums are value types and there is no way that you can specify the System.ValueType as a constraint, as per the specification. But if you wish to specify a non-reference type as a [primary] constraint, struct can be used.

private void Method where T : struct

During the course of investigation, I was surprised (my bad!) to know that the numeric types like int, float etc in C# are declared struct. It is not far from the fact that they are value types, but it was interesting to know that they are declared as:

public struct Int32 : IComparable, IFormattable, IConvertible, IComparable, IEquatable

Similar thing for other numeric types. Whereas an enum [System.Enum], though a value type, is declared as an abstract class that derives from System.ValueTypes unlike the int or float. The end result is that enums are value types but i wonder the way they are declared.

Anyway, the question still remains unresolved – why enums cannot be used as constraints, and just the specification saying that enums cannot be used as constraints does not seem satisfactory.

I am not sure if there is any other way to resolve my situation. Question open to cyber space !!!

P.S. Refer section 25.7 through for the specification on Generic Type Constraints.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s