9

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

template<typename T>
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<MinValue || value > MaxValue)
                throw gcnew System::ArgumentException("Value out of range");

            _value = value;
        }
    }

};

template ref class Number<int>;

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

4

3 回答 3

12

我有一个解决方法,声明一个继承该类的附加Number<int>类。此类现在在 C# 中可见并且可以实例化。

public ref class MyInt32 : public Number<int>
{
};
于 2009-03-25T13:47:32.100 回答
10

反光板有点躺在这里。类的名称实际上不是 Number<int>。它实际上是“数字<int>”。注意单引号。这些仅在您使用 ildasm 查看类型名称时可见。

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

于 2009-03-25T13:58:47.797 回答
1

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

于 2009-03-25T13:48:45.793 回答