C#跨页面访问数组遇权限及非静态调用问题求助
问题解决:CS0120错误与访问权限问题
错误原因及修复步骤
1. 解决CS0120错误:非静态方法调用问题
你直接通过类名Table.GetRates(...)调用方法,但GetRates是非静态方法,必须通过类的实例调用,或者将方法和关联成员改为静态:
方案一:通过实例调用
// 先创建Table类的实例 Table tableInstance = new Table(); Tuple<double, double, double> resultTuple = tableInstance.GetRates(Convert.ToDouble(txtInput.Text));
方案二:改为静态成员(推荐,适合全局复用场景)
修改tablearray.cs代码:
namespace testarray { public partial class Table { // 将Rate改为静态数组,供静态方法访问 private static double[,] Rate = new double[,] { { 0.25, 0.384615385, 0.153846154 }, { 0.255, 0.395348837, 0.15503876 }, { 0.26, 0.40625, 0.15625 }, { 0.265, 0.417322835, 0.157480315 }, { 0.27, 0.428571429, 0.158730159 }, }; // 将GetRates改为静态方法 public static Tuple<double, double, double> GetRates(double input) { double PercentToGive = 0; double ValueStore = 0; double ValueAdmin = 0; // 遍历数组行索引,而非元素值(修复原foreach的逻辑错误) for (int x = 0; x < Rate.GetLength(0); x++) { // 浮点数避免直接用==比较,用容差判断精度问题 if (Math.Abs(Rate[x, 0] - input) < 1e-9) { PercentToGive = Rate[x, 0]; ValueStore = Rate[x, 1]; ValueAdmin = Rate[x, 2]; break; } } // 补充返回语句(原代码缺失) return Tuple.Create(PercentToGive, ValueStore, ValueAdmin); } } }
修改后即可直接用Table.GetRates(...)调用。
2. 解决访问权限问题:Table.Rate inaccessible
原代码中Rate数组未指定访问修饰符,默认是private,因此其他类无法访问。不建议直接将Rate改为public破坏封装,推荐通过GetRates这类方法封装数据访问逻辑,既能解决权限问题,也能保证代码的可维护性。
额外修复:原代码的其他问题
- 原
foreach (int x in Rate)逻辑错误:遍历的是数组元素值而非索引,会导致数组越界或匹配失败,改为for循环遍历行索引更合理。 - 浮点数直接用
==比较存在精度风险,用Math.Abs(差值) < 极小值的方式判断相等更可靠。 - 原
GetRates方法缺失返回语句,必须补充return完成Tuple的返回。
内容的提问来源于stack exchange,提问作者rr944276
相关产品推荐
相关产品推荐

