我遇到了很多错误的代码。我正在研究一个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);
};
这是对的吗? 如果没有,请帮助我......
答案 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^>^
也有效)