c++/CLI中:
[StructLayout(LayoutKind:Sequential, CharSet=CharSet::Ansi)]
public ref struct NestedStruct
{
public:
int x;
};
[StructLayout(LayoutKind:Sequential, CharSet=CharSet::Ansi)]
public ref struct AStruct
{
public:
NestedStruct nestedStruct;
};
在c#: AStruct s = new AStruct();
s.nestedStruct.x = 7; // ERROR cs0570
在c++/CLI中禁止嵌套结构吗?这个结构应该在一个单独的c#程序集中定义吗?
NestedStruct nestedStruct;
这是一个问题,NestedStruct
不是一个值类型。ref struct
遵循本地c++用法,其中结构体和类之间没有真正的区别,只是在默认情况下,结构体的所有成员都是public。ref
关键字是真正重要的,您声明了引用类型而不是值类型。引用类型的变量应该用hat声明,以使其可被其他。net语言使用。解决办法:
NestedStruct^ nestedStruct;
如果你想声明一个值类型(如c#中的struct),那么你必须这样写:
public value class NestedStruct
{
public:
int x;
};
或者由于您使成员公开,您可以使用value struct
并删除public:
,因为这是结构体的默认可访问性。
当然,这个"特性"是为了让本地c++程序员适应c++/CLI语法。没有。