在c#中,想要实现指向本身的结构体如: 一个表示任务的结构体 public struct Task
{
public string taskName;
public int taskType;
public int taskLines;
public int processTime;
public int maxHead;
public int startTime;
public int finishTime;
public int priority;
public bool ordered;
public Task[] preTasks;//此任务的前序任务
}在vs2005下编译提示错误 成员名称不能与它们的封闭类型相同问题:(1)采用结构体如何实现此功能
     (2)应用类如何实现此功能

解决方案 »

  1.   

     public Task[] preTasks;//此任务的前序任务请教楼上 那上面这句如何转化成类的定义呢?  这里不太清楚
      

  2.   

    public struct Task
    {
        public string taskName;
        public int taskType;
        public int taskLines;
        public int processTime;
        public int maxHead;
        public int startTime;
        public int finishTime;
        public int priority;
        public bool ordered;    
        public Task[] preTasks;//此任务的前序任务
    }//此结构可以按如下写
    public struct Task
    {
        public string taskName;
        public int taskType;
        public int taskLines;
        public int processTime;
        public int maxHead;
        public int startTime;
        public int finishTime;
        public int priority;
        public bool ordered;    
        public int taskID; //本任务的ID
        public int preTaskID;//前序任务ID;-1表示第一个人任务
    }
      

  3.   

    11.3.1 值语义
    结构是值类型(第 4.1 节)且被称为具有值语义。另一方面,类是引用类型(第 4.2 节)且被称为具有引用语义。
    结构类型的变量直接包含了该结构的数据,而类类型的变量所包含的只是对相应数据的一个引用(被引用的数据称为“对象”)。如果结构 B 包含 A 类型(A 是结构类型)的实例字段时,则因为 A 依赖 B,会发生编译时错误。如果结构 X 包含结构 Y 类型的实例字段,则 X 直接依赖于 Y。从上述定义可以推出:一个结构所依赖的结构的完整集合就是此直接依赖于关系的传递闭包。例如
    struct Node
    {
    int data;
    Node next; // error, Node directly depends on itself
    }
    是错误的,因为 Node 包含自身类型的实例字段。另一个示例
    struct A { B b; }
    struct B { C c; }
    struct C { A a; }
    是错误的,因为类型 A、B 和 C 都彼此相互依赖。
    对于类,两个变量可能引用同一对象,因此对一个变量进行的操作可能影响另一个变量所引用的对象。对于结构,每个变量都有它们自己的数据副本(除 ref 和 out 参数变量外),因此对一个变量的操作不可能影响其他变量。另外,由于结构不是引用类型,因此结构类型的值不可能为 null。
    给定下列声明
    struct Point
    {
    public int x, y;
    public Point(int x, int y) {
    this.x = x;
    this.y = y;
    }
    }
    代码段
    Point a = new Point(10, 10);
    Point b = a;
    a.x = 100;
    System.Console.WriteLine(b.x);
    输出值 10。将 a 赋值给 b 时将创建该值的副本,因此,b 不会受到为 a.x 赋值的影响。假如 Point 被改为声明为类,则输出将为 100,因为 a 和 b 引用同一对象。--摘自<<C# Language Specification 1.2>>
      

  4.   

    回复 nayc 你说的方案我也考虑过 但是因为task的前序可能是多个 所以好像仅仅那样定义好像不行
      

  5.   


    public struct Task
    {
        public string taskName;
        public int taskType;
        public int taskLines;
        public int processTime;
        public int maxHead;
        public int startTime;
        public int finishTime;
        public int priority;
        public bool ordered;    
        public Task[] preTasks;//此任务的前序任务
    }改为类定义public class Task
    {
        public string taskName;
        public int taskType;
        public int taskLines;
        public int processTime;
        public int maxHead;
        public int startTime;
        public int finishTime;
        public int priority;
        public bool ordered;    
        public Task[] preTasks;//此任务的前序任务
    }