The more I dive into implementing Skila the more I appreciate the role of the type system. Yet another interesting case is with generics — how to make them compile-once and be efficient for both complex and native types? Say, you would like to implement “
Vector<T>” — one operation which has to be executed is copying the value.
In C++ world you define template and when using it, given type appears viable (or not), however it goes with the price of compilation of each instantiation of the template. In C# you can specify constraint that “
T” has to inherit from something like “
ICopyable”. But native types do not inherit from anything, so how to make them fit into a template?
I noticed that generics supports object oriented programming, but is not dependent of it. So sure, you can express such constraint, but you can specify another one — making “
T” to provide all methods (or extension functions) declared in “
This makes type such as “
Int” fit for “
class Vector<T> where T : static ICopyable; ...
Note the keyword “
T” is no longer checked against given inheritance, but against providing a set of methods.
The methods are checked when “
Vector” is instantiated, if you would like to make the code more explicit specify static inheritance when defining the class:
class Foo : static ICopyable ...
This does not add regular inheritance, instead it enforces the given suite of the methods when defining the class “
Foo”, not when calling for “