使用ref关键字处理数组数学运算时遭遇CS7036错误的求助
问题分析与解决方案
错误原因(CS7036)
当调用带有ref参数的方法时,必须传递一个已初始化的变量并在参数前加上ref关键字。直接传递GetTemperatures()的返回值(临时值)不符合要求,因为ref需要引用可寻址的变量。此外代码中还存在其他逻辑错误,以下是完整修正方案:
修正后的GetTemperatures方法
原方法存在数组访问错误和类型错误(尝试对int调用Substring),修正后正确展示二维数组:
public int[,] GetTemperatures() { int[,] dailyTemperature = { {38, 40, 42, 34}, {55, 41, 40, 30}, {28, 39, 21, 60}, {61, 52, 43, 42}, {35, 36, 30, 29}, {24, 33, 37, 40} }; Console.WriteLine("原二维温度数组:"); for (int i = 0; i < dailyTemperature.GetLength(0); i++) { for (int j = 0; j < dailyTemperature.GetLength(1); j++) { Console.Write(dailyTemperature[i, j] + "\t"); } Console.WriteLine(); } return dailyTemperature; }
修正后的GetTemperatureSum方法
原方法存在变量作用域错误、数组访问错误,且ref关键字无必要(未修改输入数组),修正后通过循环计算每行总和:
public int[] GetTemperatureSum(int[,] dailyTemperature) { int rowCount = dailyTemperature.GetLength(0); int colCount = dailyTemperature.GetLength(1); int[] temperatureSum = new int[rowCount]; for (int i = 0; i < rowCount; i++) { int sum = 0; for (int j = 0; j < colCount; j++) { sum += dailyTemperature[i, j]; } temperatureSum[i] = sum; } Console.WriteLine("\n每行温度总和数组:"); foreach (int sum in temperatureSum) { Console.Write(sum + "\t"); } Console.WriteLine(); return temperatureSum; }
正确的Main方法调用方式
在do...while循环中正确调用两个方法,避免CS7036错误:
static void Main(string[] args) { Weather weather = new Weather(); bool continueDisplay; do { int[,] tempArray = weather.GetTemperatures(); weather.GetTemperatureSum(tempArray); Console.WriteLine("\n是否继续展示?(Y/N)"); continueDisplay = Console.ReadLine().Trim().Equals("Y", StringComparison.OrdinalIgnoreCase); } while (continueDisplay); }
关键修正点总结
- 移除不必要的
ref关键字:方法仅读取二维数组值,无需修改原数组,去掉ref简化调用逻辑。 - 修复数组访问逻辑:二维数组必须用
[i,j]访问,一维数组不能调用GetLength(1)。 - 调整变量作用域:将
temperatureSum数组声明在循环外部,避免重复初始化。 - 替换硬编码求和:用循环实现求和,适配数组行数/列数变化的场景。
- 规范参数传递:先将
GetTemperatures()返回值存入变量,再传递给求和方法。
内容的提问来源于stack exchange,提问作者ronalddonaldronald
相关产品推荐
相关产品推荐

