我在一个类中有一个double[,]
字段,重要的是直接访问它不会被赋予外部,所以我创建了一个读写属性来控制它并使它成为private
。我在类中也有一个嵌套的struct
,我想保留它作为一个值类型。结构本身有一个double[,]
字段,它再次由相应的读写属性控制。在给定某些条件的情况下,如果为属性指定了以特定方式无效的值,则会抛出自定义exception
。我需要传递给exception
的一个参数是基于父类的double[,]
字段的值,但是我似乎无法从结构中访问它而不使它成为public
或internal
。我已经尝试了protected
和private
,但都没有效果。还有另一种解决方法吗?
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...
}
我正在考虑可能访问属性而不是字段,但我需要属性的值来处理有问题的struct实例的特定实例。是否有类似this.parent
的东西(我确实尝试过这个并不起作用,但也许在概念上类似的一些解决方法)?
我假设您希望myStruct
与包含classField
实例的myClass
交谈。
如果是这种情况:那么问题不是可访问性 - 它已经具有访问权限;问题是范围。就编译器而言,嵌套在这里与实例化无关,所以问题是myStruct
没有特定的classProperty
实例可以与之交谈。这就是错误的原因:
错误CS0120非静态字段,方法或属性'myClass.classField'需要对象引用
而不是可访问性:
错误CS0122'myClass.classField'由于其保护级别而无法访问
事实上,classField
在可访问性方面可以是private
:嵌套类型可以看到包含类型的private
成员。
你需要做的是:
private struct myStruct
{
private readonly myClass _obj;
public myStruct(myClass obj) => _obj = obj;
// ...
}
而不只是classField
,你需要告诉它与_obj.classField
交谈,告诉它实例。你还需要构建与其相关的特定myStruct
传递的myClass
。
基本上:你在问题中提到的this.parent
概念并不是隐含的 - 你需要自己实现它。