C#只读属性中switch表达式使用枚举ToString()无法编译的原因求解
编译失败核心原因
C# 语法要求 switch 表达式中每个分支的匹配值(=> 左侧的内容)必须是编译时常量。你使用的InitialMarginMeasure.Flat.ToString()属于运行时方法调用,返回值是在程序运行阶段才计算得到的,不属于编译期可确定的常量,因此不符合语法规则,触发编译报错。
可用解决方案
方案1(推荐):将Measure属性改为强类型枚举
直接把Measure的类型从string替换为你定义的InitialMarginMeasure枚举,既满足编译要求,还能避免字符串写错的隐患:
public class InitialMargin { // ... properties // 把属性类型改成枚举 public InitialMarginMeasure Measure { get; set; } public decimal? Amount { get; set; } public decimal? MarketValue { get; set; } public decimal? Margin => Measure switch { // 枚举值属于编译时常量,符合语法要求 InitialMarginMeasure.Flat => Amount, InitialMarginMeasure.MarketValue => Amount * MarketValue, _ => default }; } public enum InitialMarginMeasure { Flat, MarketValue }
方案2:保留Measure为string类型,使用nameof运算符获取常量字符串
如果业务逻辑要求Measure必须是string类型,可以用nameof运算符替代ToString(),nameof的返回值是编译期确定的字符串常量,符合匹配要求:
public decimal? Margin => Measure switch { nameof(InitialMarginMeasure.Flat) => Amount, nameof(InitialMarginMeasure.MarketValue) => Amount * MarketValue, _ => default };
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

