反编译DLL项目出现CS0460泛型约束编译错误求助
解决CS0460编译错误:重写方法重复指定泛型约束问题
错误提示
CS0460 Constraints for override and explicit interface implementation methods are inherited from the base method, so they cannot be specified directly, except for either a 'class', or a 'struct' constraint. QuestradeAPI.Net
问题定位
错误出现在MsgBracketOrderImpactRequest及其内部类BracketOrderComponent的AcceptVisitor重写方法中。基类IVisitable已经为AcceptVisitor<Visitor>方法定义了where Visitor : IVisitor的泛型约束,C#编译器规定重写方法时会自动继承基类的泛型约束,无需再次声明,重复指定就会触发CS0460错误。
解决方案
移除两个重写方法中的where Visitor : IVisitor约束即可,具体修改如下:
修改后的MsgBracketOrderImpactRequest.AcceptVisitor方法
internal override void AcceptVisitor<Visitor>(Visitor v) { v.StartObject<MsgBracketOrderImpactRequest>(this); v.VisitBasicField<string>(ref this.m_accountNumber, "accountNumber", false); v.VisitBasicField<ulong>(ref this.m_symbolId, "symbolId", false); v.VisitBasicField<string>(ref this.m_primaryRoute, "primaryRoute", false); v.VisitBasicField<string>(ref this.m_secondaryRoute, "secondaryRoute", false); v.VisitObjectArrayField<MsgBracketOrderImpactRequest.BracketOrderComponent>(this.m_components, "components", false); v.EndObject<MsgBracketOrderImpactRequest>(this); }
修改后的BracketOrderComponent.AcceptVisitor方法
internal override void AcceptVisitor<Visitor>(Visitor v) { v.StartObject<MsgBracketOrderImpactRequest.BracketOrderComponent>(this); v.VisitBasicField<double>(ref this.m_limitPrice, "limitPrice", false); v.VisitBasicField<double>(ref this.m_stopPrice, "stopPrice", false); v.VisitEnumField<OrderType>(ref this.m_orderType, "orderType", false); v.VisitEnumField<OrderTimeInForce>(ref this.m_timeInForce, "timeInForce", false); v.VisitEnumField<OrderClass>(ref this.m_orderClass, "orderClass", false); v.VisitBasicField<ulong>(ref this.m_orderId, "orderId", false); v.VisitBasicField<double>(ref this.m_quantity, "quantity", false); v.VisitEnumField<OrderAction>(ref this.m_action, "action", false); v.EndObject<MsgBracketOrderImpactRequest.BracketOrderComponent>(this); }
原理说明
C#中重写泛型方法时,基类方法的泛型约束会自动被继承,只有class或struct这类特殊约束允许在重写时额外补充,其他类型的约束重复声明都会导致编译错误。
内容的提问来源于stack exchange,提问作者Ameer
相关产品推荐
相关产品推荐

