ref类中的ref struct声明

时间:2011-11-30 13:18:56

标签: .net c++-cli

我遇到了很多错误的代码。我正在研究一个ref类,我已经声明了一个结构,我知道,我不允许使用通常的结构,它必须是一个ref结构。但我仍然得到奇怪的错误:

  

错误C3816:'namespace :: className :: structName'先前已声明   或使用不同的托管修饰符定义

代码示例:

ref class someclass{

    ref struct somestruct{
        char a1;
        char a2;
    };
    //my decleration.
    array<struct somestruct>^ variable = gcnew array<struct somestruct>(5);
};

这是对的吗? 如果没有,请帮助我......

3 个答案:

答案 0 :(得分:3)

这是解决问题的一种方法:

ref class someclass{

    ref struct somestruct{
        char a1;
        char a2;
    };
    array<somestruct^>^ variable;

    someclass() : variable(gcnew array<somestruct^>(5))
    {
    }
};

答案 1 :(得分:2)

你在这里与基本语法作斗争。值类型和引用类型之间的区别在托管代码中非常重要。您声明了ref struct,这要求您在数组声明中使用帽子。你也不希望在这里非常。它们与完全类似,并在堆上进行分配。像这样的简单结构应该是值struct ,它最接近于C或C ++结构。

不要在数组声明中使用 struct 关键字,即C语法。最后一个问题是你无法初始化这样的成员,只有C#编译器支持它。通过将代码移动到构造函数中来实现它。在C ++ / CLI中,您必须自己完成此操作。所以你想要的语法是:

public ref class someclass {
private:
    value struct somestruct{
        char a1;
        char a2;
    };
    array<somestruct>^ variable;
public:
    someclass() {
        variable = gcnew array<somestruct>(5);
        //todo: initialize array members
    }
};

猜测私人与公众应该是什么。

答案 2 :(得分:1)

错误消息显示您在ref之前忘记了struct 由于它不是C,因此您不需要在struct前添加类型名称。只需使用array<somestruct^>^
(但array<ref struct somestruct^>^也有效)