Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# generic with constant

Tags:

Is there something similar to this C++ template?

template <int A> class B {     int f()     {         return A;     } } 

I want to make every instance of B<1>, B<2>, etc (eg tuple) a different type.

like image 906
Andrew Avatar asked Jan 08 '11 22:01

Andrew


2 Answers

The short answer is no.

It doesn't fit the way C# generics, as apposed to C++ templates, work.

The .net generics are not a language feature, they are a runtime feature. The runtime knows how to instantiate generics from special generic bytecode which is rather restricted compared to what C++ templates can describe.

Compare this with C++ templates, which basically instantiate the whole AST of the class using substituted types. It'd be possible to add AST based instantiation to the runtime, but it'd certainly be much more complex than the current generics.

Without features like value-type arrays (which only exist in unsafe code), recursive template instantiation or template specialization using such parameters wouldn't be very useful either.

like image 181
CodesInChaos Avatar answered Dec 05 '22 05:12

CodesInChaos


A workaround to this limitation is to define a class which itself exposes the literal value you are interested in. For example:

public interface ILiteralInteger {    int Literal { get; } }  public class LiteralInt10 : ILiteralInteger {    public int Literal { get { return 10; } } }  public class MyTemplateClass< L > where L: ILiteralInteger, new( ) {    private static ILiteralInteger MaxRows = new L( );     public void SomeFunc( )    {       // use the literal value as required       if( MaxRows.Literal ) ...    } } 

Usage:

var myObject = new MyTemplateClass< LiteralInt10 >( ); 
like image 22
Kevmeister68 Avatar answered Dec 05 '22 05:12

Kevmeister68