在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
我相信这样做是为了使类型在大多数语言中不可绑定,因为他们无法理解C ++模板的实际工作方式。 这使得它实际上只对C ++编译器可见,这是合适的,因为它是唯一实际支持模板的MS编译器(templates!= generics)。
如果您的目标是在C ++ CLI中创建参数化类型,然后在C#中使用该类型,我认为您需要创建generics类型而不是模板类型(请参阅Stan Lippman的博客 ,了解两种方法存在的原因)。 有关如何在C ++ CLI中创建generics类型的信息,请参见此处 。