在C#中使用C ++ CLI模板类

我在C ++ / CLI中有以下类和int原语的显式模板实例化。

template public ref class Number { T _value; public: static property T MinValue { T get() { return T::MinValue; } } static property T MaxValue { T get() { return T::MaxValue; } } property T Value { T get() { return _value; } void set(T value) { if( value MaxValue) throw gcnew System::ArgumentException("Value out of range"); _value = value; } } }; template ref class Number; 

在编译它并使用reflection器检查生成的程序集时,我能够看到一个名为Number的类,但在尝试在C#中实例化这个相同的类时,编译器抱怨某些System::Number类没有采用模板参数。 我究竟做错了什么? 这可以完成吗?

我有一个解决方法,声明一个inheritanceNumber类的附加类。 此类现在在C#中可见,并且可以实例化。

 public ref class MyInt32 : public Number { }; 

reflection器在这里了一点。 该类的名称实际上不是Number 。 它实际上是’Number ‘。 注意单引号。 这些只有在使用ildasm查看类型名称时才可见。

相信这样做是为了使类型在大多数语言中不可绑定,因为他们无法理解C ++模板的实际工作方式。 这使得它实际上只对C ++编译器可见,这是合适的,因为它是唯一实际支持模板的MS编译器(templates!= generics)。

如果您的目标是在C ++ CLI中创建参数化类型,然后在C#中使用该类型,我认为您需要创建generics类型而不是模板类型(请参阅Stan Lippman的博客 ,了解两种方法存在的原因)。 有关如何在C ++ CLI中创建generics类型的信息,请参见此处 。