如何让嵌套结构访问其父 类 的字段而不使这些字段成为 public 或内部?

How can I give nested structs access to fields of their parent classes without making those fields public or internal?

我在 class 中有一个 double[,] 字段,重要的是不要让外部直接访问它,所以我创建了一个读写 属性控制它并使它成为private。我在 class 中还有一个嵌套的 struct,我想将其保留为值类型。该结构本身有一个 double[,] 字段,同样由相应的读写 属性 控制。在特定条件下,如果 属性 被分配了一个以特定方式无效的值,它会抛出自定义 exception。我需要传递给 exception 的参数之一是基于来自父 class 的 double[,] 字段的值,但我似乎无法从在结构中而不使其成为 publicinternalprotectedprivate 我都试过了,但都不行。还有其他解决方法吗?

class myClass {
    protected double[,] classField;
    public double[,] classProperty {
        get { return (double[,])classField.Clone();
        set { /* code to validate the value and assign it */ }
    }
    private struct myStruct {
        private double[,] structField;
        public structProperty{ 
            get { return (double[,])structField.Clone(); }
            set {
                if (!validate(value)) 
                    throw new customException(classField.getLength(1));
                structField = (double[,])value.Clone();
            }
        }
        //other fields, constructors, and methods...
    }
    //other fields, constructors, and methods...
}

我正在考虑可能访问 属性 而不是字段,但我需要 属性 的值用于包含相关结构实例的特定实例。是否有类似 this.parent 的东西(我确实尝试过但没有用,但可能有一些概念上类似的解决方法)?

我假设您希望 myStruct 与包含 myClass 实例的 classField 对话。

如果是这样:那么问题不在于可访问性 - 它已经具有访问权限;问题是 scope。就编译器而言,这里的嵌套与实例化无关,所以问题是 myStruct 没有 classProperty 的特定 实例 可以与之交谈。这就是为什么错误是:

Error CS0120 An object reference is required for the non-static field, method, or property 'myClass.classField'

而不是可访问性:

Error CS0122 'myClass.classField' is inaccessible due to its protection level

事实上,就可访问性而言,classField 可以是 private:嵌套类型可以看到包含类型的 private 个成员。

您需要做的是:

private struct myStruct
{
    private readonly myClass _obj;
    public myStruct(myClass obj) => _obj = obj;
    // ...
}

然后你需要告诉它与 _obj.classField 对话以告诉它实例,而不仅仅是 classField。您还需要构建 myStruct 并在 中传递 与之相关的特定 myClass

基本上:您在问题中提到的 this.parent 概念不是隐含的 - 您需要自己实现它。