C# double类型Vector声明赋值报CS0200只读错误解决
错误根因
CS0200报错的核心是你调用的Vector<double>构造重载(传入预分配double数组+起始偏移量)生成的是只读包装实例,该实例的int类型索引器只开放了get访问器,没有开放set访问器,无法直接通过索引器赋值。这个重载的设计目的是快速包装已有固定数据做线性代数计算,本身就不支持修改元素。
修复方案
单资产价格数组的正确声明赋值
不要直接用基类Vector的数组入参构造,改用可写的密集向量实例创建方式,对应代码替换为:
// 替换原声明逻辑,创建可写、起始索引为-N、长度为2N+1的向量 var asset = Vector<double>.Build.Dense(2 * N + 1, -N); // 后续赋值逻辑可正常执行,不会触发只读错误 asset[-N] = S * Math.Exp(-N * dx);
如果你使用的第三方Vector实现没有提供Build静态构造方法,也可以直接调用实例的赋值方法绕过索引器只读限制:
// 兼容只读索引器的赋值写法 var asset = new Vector<double>(new double[2 * N + 1], -N); asset.SetValue(-N, S * Math.Exp(-N * dx));
嵌套期权价值数组的适配
嵌套Vector<Vector<double>>结构同样遵循“不直接用数组包装构造”的规则,逐层创建可写实例即可:
// 假设总时间步为TimeSteps,初始化期权价值外层向量 var optionValues = new Vector<Vector<double>>(TimeSteps + 1); for (int k = 0; k <= TimeSteps; k++) { // 每个时间步对应的资产价格节点向量单独创建为可写实例,起始索引为-k optionValues[k] = Vector<double>.Build.Dense(2 * k + 1, -k); } // 后续倒推赋值逻辑可正常通过索引器执行
避坑提示
- 所有需要修改元素值的Vector实例,优先通过
Vector<T>.Build.Dense()方法创建,该方法生成的实例索引器完整开放get/set访问器 - 若你使用的是自定义实现的Vector类,优先检查索引器的set访问器访问修饰符,若被标记为
private/internal,统一改用类提供的SetValue()方法做元素赋值即可
内容的提问来源于stack exchange,提问作者Paulo Bissonho
相关产品推荐
相关产品推荐

