You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:54:23