为什么我可以在 c#7.3 中将 ref 结构声明为类的成员?

joe*_*joe 4 .net c# struct ref-struct c#-7.3

根据文档

不能将 ref 结构声明为类或普通结构的成员。

但我成功地编译并运行了这个:

public ref struct RefStruct
{
    public int value;
}
public class MyClass
{
    public RefStruct Item => default;
}    
...       

MyClass c = new MyClass();
Console.WriteLine(c.Item.value);
Run Code Online (Sandbox Code Playgroud)

现在RefStruct是 aref struct并且它是一个类的成员。这种说法在某些情况下是错误的吗?

更新 现在文档已更新为更准确的描述。

Ale*_*kov 6

它不是类的字段,而是属性 getter 的返回值 - 这很好,因为它只是函数返回值。

请注意,“作为类的成员”通常包括属性,可能应该更改为“类的字段”。

如果您尝试将其声明为类字段(直接或通过自动实现的属性间接),这将需要将类的一部分( 的数据ref struct)分配在堆栈上,并将其余部分分配在托管堆中。

问题中的代码定义了非自动实现的属性。因此,编译器不需要在类中自动创建属性类型的隐藏字段。因此,虽然属性结果类型ref struct实际上不存储在类中,因此并不违反该ref struct类型不包含在任何类中的要求。请注意,即使制作 setter 方法本身也很好 - 存储该属性的值会很棘手,但您可以安全地将ref structpublic int value;如帖子中所示)的内容存储在 中set并在 中重新创建它get