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

时间:2015-01-06 09:51:29

标签: c#

我在Visual Studio 2012中工作。 我只是尝试使用指向相同结构的指针创建结构:

namespace PLT_1_lab {
    class Program {
        struct tNode {
            string oper;
            int level;
            tNode *left;
            tNode *right;
        }
    }
}

并且在*行中我得到错误(我已经翻译了VS所以它看起来有点不同):

  

无法获取地址,定义声明指向受控类型的指针的大小(“PLT_1_lab.Program.tNote”)

3 个答案:

答案 0 :(得分:7)

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

结构是一种值类型,但是类是引用类型,因此将结构更改为类可以解决这个问题:

class tNode
{
    string oper;
    int level;
    tNode left;
    tNode right;
}

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

答案 1 :(得分:5)

Matthew's answer可能是最合适的方式,但只是为了解释为什么编译器在抱怨......

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

  

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

pointer-type:
    unmanaged-type   *
    void   *
unmanaged-type:
    type
     

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

     

...

     

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

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

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

所以这里的问题是你的tNode结构包含string值。没有它 - 假设你处于不安全的环境中 - 代码就会编译。

答案 2 :(得分:2)

不,你不能这样做。

正确的方法是使用class代替struct

现在,为什么首先出现这个问题?

MSDN下的Pointer types

对此进行了描述
  

指针不能指向引用或包含引用的结构,因为即使指针指向对象引用也可以进行垃圾回收。垃圾收集器不会跟踪任何指针类型是否指向对象。

(我的重点)

所以这里的问题不是指针,因此,结构包含一个字符串。

此结构有效:

namespace PLT_1_lab {
    class Program {
        struct tNode {
            // string oper;
            int level;
            tNode *left;
            tNode *right;
        }
    }
}

所以解决这个问题的另一种方法是用其他东西替换指向字符串的指针,比如可以编组为BStr或类似的东西,但所有这些都取决于为什么你这样做而不是仅仅使用class开始。