我在Visual Studio 2012中工作.我只是尝试使用指向相同结构的指针创建结构:
namespace PLT_1_lab {
class Program {
struct tNode {
string oper;
int level;
tNode *left;
tNode *right;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在*行中我得到错误(我已经翻译了VS所以它看起来有点不同):
无法获取地址,定义声明指向受控类型的指针的大小("PLT_1_lab.Program.tNote")
在C#中,如果需要参考机制,通常使用引用类型.
struct是一个值类型,但是一个类是一个引用类型,因此将结构更改为一个类就可以了:
class tNode
{
string oper;
int level;
tNode left;
tNode right;
}
Run Code Online (Sandbox Code Playgroud)
在此上下文中,null引用等同于C++的空指针.
马修的答案可能是最合适的方法,但只是为了解释为什么编译器在抱怨......
从C#5规范,第18.2节(指针类型):
指针类型被写为非托管类型或关键字void,后跟*标记:
Run Code Online (Sandbox Code Playgroud)pointer-type: unmanaged-type * void * unmanaged-type: type在指针类型中*之前指定的类型称为指针类型的指示类型.它表示指针类型的值所指向的变量的类型.
...
非托管类型是任何不是引用类型或构造类型的类型,并且在任何嵌套级别都不包含引用类型或构造类型字段.换句话说,非托管类型是以下之一:
- sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.
- 任何枚举类型.
- 任何指针类型.
- 任何用户定义的struct-type,它不是构造类型,只包含非托管类型的字段.
混合指针和引用的直观规则是允许引用(对象)的引用包含指针,但不允许指针的引用包含引用.
所以这里的问题是你的tNodestruct包含一个string值.没有它 - 假设你处于不安全的环境中 - 代码编译.