自适应移动平均交易系统报public修饰符无效错误如何解决
错误原因
触发该报错的核心是C#语法规则限制:
- 你在第21行写的属性声明
public int AvgTrueRange.value1 { get; set; }不符合C#类成员命名规则,.是成员访问运算符,不能出现在自定义属性/字段的名称中。 - 编译器会把
AvgTrueRange.value1识别为显式接口实现语法,而显式接口实现的成员不允许添加public这类访问修饰符,因此直接抛出以下错误:
the modifier public is not valid for this item
哪怕你删掉public也会因为语法不匹配继续报错。
修复方案
第一步:修复核心语法错误
根据你的业务逻辑二选一即可:
- 如果你是要在当前类中新增一个存储ATR阈值的属性,直接将属性名修改为合法的C#命名即可,示例:
// 替换原第21行代码 public int AtrThreshold { get; set; }
后续构造函数赋值、逻辑判断中用到AvgTrueRange.value1的地方统一替换为AtrThreshold。
- 如果你是要访问已经初始化过的
AvgTrueRange指标实例的value1成员,不需要在当前类重复声明,直接删除第21行的整行代码即可。
第二步:修复代码中其他潜在编译错误
你的代码还有多处不符合C#语法的问题,需要同步修改才能正常运行:
- 补全
FirstAverage方法的返回值:非void方法必须保证所有执行分支都有返回值,示例修改:
private double FirstAverage() { if (AverageTrueRange < AtrThreshold) return FirstLength; return 0; // 替换为你的业务逻辑需要的默认返回值 }
- 修正方法调用语法:
CalcBar中switch (FirstAverage)需要改为switch (FirstAverage()),FirstAverage是方法,必须加括号调用才能拿到返回值参与判断。 - 补全括号:
Bars.Close.CrossesOver所在的if判断缺少右括号,修改为:
if (Bars.CurrentBar > 1 && Bars.Close.CrossesOver(FirstAverage(), ExecInfo.MaxBarsBack))
- 修正switch case语法:C#中case后面必须跟常量,你当前写的
case FirstLength:不合法,因为FirstLength是可变属性,建议将这段switch逻辑替换为if判断。
内容的提问来源于stack exchange,提问作者Vittoria
相关产品推荐
相关产品推荐

