4

根据文档

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

但我设法编译并运行了这个:

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

MyClass c = new MyClass();
Console.WriteLine(c.Item.value);

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

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

4

1 回答 1

5

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

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

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

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

于 2019-06-21T06:31:44.913 回答