Monthly Archives: December 2013

Flip ‘where’ inheritance constraint for generic methods

The MSDN provides an example for a generic method in C# with a constraint on the generic type of the method. It must derive from T which is the generic type of the surrounding class Bar.

class Bar<T>
{
    void Foo<U>(Data<U> data) where U : T {/*...*/}
}

However it is not possible to compile:

class Bar<T>
{
    void Foo<U>(Data<U> data) where T : U {/*...*/}
}

Which is setting the constraint that U must be a base class of T.
With a little trick it is still possible to have that generic type constraint: by using an extension method.

class Bar<T>
{
    /*...*/
}

class BarExtension
{
   void Foo<T,U>(this Bar<T> bar, Data<U> data) where T : U {/*...*/}
}

Of course this is not as nice as having that method where it belongs to (in the Bar class) but still better than doing a runtime type check.

Flattr this!