C#自定义隐式转换触发user-defined cast相关报错问题咨询
报错触发原因
首先你遇到的报错实际应为 user-defined cast must be cast from or to the enclosing type,大概率是拼写识别误差导致显示为delimiter,触发原因是C#对自定义转换运算符的语法强制约束:
- 所有自定义的隐式/显式转换运算符,必须定义在对应的类/结构体内,且至少有一个操作数的类型等于运算符所在的类/结构体类型
你的代码里是在CharCashItemOutputBoxEntity类中定义转换运算符,参数是BaseEntity、返回值是long,两个类型都和当前类没有关联,完全不符合上述语法规则,因此直接编译报错。
对应解决方法
根据你的实际需求二选一即可:
方案1:所有BaseEntity子类都支持转long取Id
直接把转换运算符的定义移到BaseEntity类内部即可,符合语法规则,所有继承BaseEntity的子类都可复用该转换逻辑:
public class BaseEntity { public long Id { get; set; } // 其余BaseEntity的原有属性和逻辑 public static implicit operator long(BaseEntity baseEntity) { // 可按需加空值判断 return baseEntity == null ? 0 : baseEntity.Id; } }
方案2:仅CharCashItemOutputBoxEntity支持转long取Id
把转换运算符的参数类型修改为当前类CharCashItemOutputBoxEntity即可:
public class CharCashItemOutputBoxEntity : BaseEntity { // 你的原有属性代码... public static implicit operator long(CharCashItemOutputBoxEntity entity) { // 可按需加空值判断 return entity == null ? 0 : entity.Id; } }
额外注意
如果转换过程可能出现空引用、数据丢失的情况,建议将implicit(隐式转换)改为explicit(显式转换),调用时需要手动强转,避免不可预期的隐式转换异常。
内容的提问来源于stack exchange,提问作者Quenio Rojer
相关产品推荐
相关产品推荐

