为什么可以';我在C#中的struct中有相同的struct type属性吗?

为什么可以';我在C#中的struct中有相同的struct type属性吗?,c#,C#,我有一个名为Node的struct类型,如下所示: struct Node { int data; Node next; } 当我编译上面的代码时,我得到了编译时错误,但如果我把它作为一个类,一切都很好 class Node { int data; Node next; } 两个(我知道一个是struct(value-type),另一个是class(ref-type))之间的区别是什么?如果定义class,节点只是引用类型节

我有一个名为Node的
struct
类型,如下所示:

struct Node
{
    int data;
    Node next; 
}
当我编译上面的代码时,我得到了编译时错误,但如果我把它作为一个类,一切都很好

class Node
    {
        int data;
        Node next; 
    }

两个(我知道一个是
struct(value-type)
,另一个是
class(ref-type)
)之间的区别是什么?

如果定义
class
节点
只是引用类型
节点。在结构情况下,您有
节点的嵌套
结构,即节点中的循环嵌套节点。

您是否用C类语言编程过?你知道,类/结构和指针等等

如果是这样的话,那么请记住:在C#中,“类”是“作为指针”传递的,而“结构”是以原始二进制形式传递的,它们是复制的,就像C/C++中的任何非指针式非引用一样。嵌套的所有其他限制都被保留,只是名称不同而已


在C#中,你可以有一个包含“class X”类型字段的“class X”,因为“class”从来不会直接放在任何地方。这样的字段实际上是一个4/8字节的指针/引用。“X类”的大小很容易确定。相反,在C#中,不能有包含“struct X”类型字段的“struct X”。这样的字段将直接嵌入外部结构中,而不是通过指针/引用。如果“struct X”包含另一个“struct X”,那么该“struct X”的大小是多少?根据其定义,该“struct X”肯定会包含另一个包含。。。。结局在哪里?你将如何标记结束?编写“new X()”时,编译器/运行时如何知道要分配多少空间?正如在C/C++中,您不能直接创建递归嵌套类型(只能通过指针/引用来创建),在C#中,您不能创建递归结构。

因为这样会破坏堆栈。您对值类型和引用类型之间的区别了解多少?您希望
节点
结构的大小是多少?(假设它必须包含另一个
节点
结构和一个
int
…)您的结构大小总和为无穷大。。。还有更多@JonSkeet我想我现在知道为什么编译器会抱怨循环嵌套了。如果你的眼睛因为C#/CLR/etc内部机制的不完美描述而酸痛,那么,试着用冷水冲洗一下:)这100%不是为了完美,而是为了让C/C++程序员很快理解,他们经常在C#中发现问题,因为在这个环境中有一个相似但不同的术语。