I know you can write:
class GenericClass<T> where T : new()
{
}
to enforce that T
has an empty constructor.
My Qs are :
can you enforce that T
has a constructor with a specific type of parameter? Like:
class SingletonFactoryWithEmptyConstructor<T> where T : new(int)
can you enforce that T
has a static function (let's say, void F()
) so that you can use this function inside the generic class? Like :
class GenericClass<T> where T : void F()
{
void G ()
{
T.F();
}
}
I know you can specify that T
implements an interface but I don't want that. I want to specify that T
has a static function.
Value type constraint If we declare the generic class using the following code then we will get a compile-time error if we try to substitute a reference type for the type parameter.
Interface Type Constraint You can constrain the generic type by interface, thereby allowing only classes that implement that interface or classes that inherit from classes that implement the interface as the type parameter.
C# allows you to use constraints to restrict client code to specify certain types while instantiating generic types. It will give a compile-time error if you try to instantiate a generic type using a type that is not allowed by the specified constraints.
No, there's nothing like this in C#.
I've previously suggested that "static interfaces" could express this reasonably neatly. They'd only be useful for generic type constraints (I suspect, anyway) but then you could express:
The last of these points is particularly interesting in my view, allowing things like a generic "Average" method over numeric types with suitable addition and division operators.
I believe some folks at MS have thought about something similar, but I haven't heard anything to suggest they're actively working on it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With