C#generics与常量

有没有类似于这个C ++模板的东西?

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

我想使B ,B 等的每个实例(例如元组)成为不同的类型。

简短的回答是否定的

它不适合C#generics的方式,因为它适用于C ++模板。

.netgenerics不是语言function,它们是运行时function。 运行时知道如何从特殊的通用字节码中实例化generics,与C ++模板可以描述的相比,这是非常有限的。

将其与C ++模板进行比较,C ++模板基本上使用替换类型实例化类的整个AST。 可以将基于AST的实例化添加到运行时,但它肯定比当前的generics要复杂得多。

如果没有值类型数组(仅存在于不安全代码中)等function,使用此类参数的递归模板实例化或模板特化也不会非常有用。

C#不支持像C ++那样的非类型generics参数。

C#generics比C ++模板简单得多,能力也差。 MSDN有一个简洁的C ++模板和C#generics之间的差异列表。

此限制的解决方法是定义一个类,该类本身公开您感兴趣的文字值。例如:

 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 ) ... } } 

用法:

 var myObject = new MyTemplateClass< LiteralInt10 >( ); 

C#generics专门用于运行时,而C ++模板在编译时处理以创建一个全新的类型。 鉴于此,运行时根本没有处理非类型参数的function(它不仅仅是C#问题)。