C#无法在结构中声明指针变量

Inf*_*eus 3 c#

我在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")

Mat*_*son 7

在C#中,如果需要参考机制,通常使用引用类型.

struct是一个值类型,但是一个类是一个引用类型,因此将结构更改为一个类就可以了:

class tNode
{
    string oper;
    int level;
    tNode left;
    tNode right;
}
Run Code Online (Sandbox Code Playgroud)

在此上下文中,null引用等同于C++的空指针.


Jon*_*eet 5

马修的答案可能是最合适的方法,但只是为了解释为什么编译器在抱怨......

从C#5规范,第18.2节(指针类型):

指针类型被写为非托管类型或关键字void,后跟*标记:

pointer-type:
    unmanaged-type   *
    void   *
unmanaged-type:
    type
Run Code Online (Sandbox Code Playgroud)

在指针类型中*之前指定的类型称为指针类型的指示类型.它表示指针类型的值所指向的变量的类型.

...

非托管类型是任何不是引用类型或构造类型的类型,并且在任何嵌套级别都不包含引用类型或构造类型字段.换句话说,非托管类型是以下之一:

  • sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.
  • 任何枚举类型.
  • 任何指针类型.
  • 任何用户定义的struct-type,它不是构造类型,只包含非托管类型的字段.

混合指针和引用的直观规则是允许引用(对象)的引用包含指针,但不允许指针的引用包含引用.

所以这里的问题是你的tNodestruct包含一个string值.没有它 - 假设你处于不安全的环境中 - 代码编译.