隐式运算符引发方法签名解析歧义,寻求替代解决方案
方法调用歧义问题及替代方案咨询
现有代码结构
我有两个用于创建Constraint<T>实例的方法:
- 第一个创建
Constraint<Quantity>类型实例 - 第二个创建
Constraint<IParameter<Quantity>>类型实例
方法代码如下:
public void ConstrainBetween(Quantity min, Quantity max) { // ... 实现逻辑 } public void ConstrainBetween(IParameter<Quantity> min, IParameter<Quantity> max) { // ... 实现逻辑 }
参数类型的定义:
public class Quantity { double Value; // ... 其他成员 } public class IParameter<T> { T Value; Func<T> Formula; // ... 其他成员 }
之后我为IParameter<T>重载了隐式运算符,代码修改为:
public class IParameter<T> { public T Value; public Func<T> Formula; public static implicit operator T(IParameter<T> p) { return p.Value; } }
编译错误情况
现在以下调用无法通过编译:
HydrModel.TopWaterLevel5yr.ConstrainBetween(OutletPipe.IL, Transform.Z); HydrModel.TopWaterLevel30yr.ConstrainBetween(OutletPipe.IL, Transform.Z);
错误信息:
调用在以下方法或属性之间不明确:“QuantityInput.ConstrainBetween(Quantity, Quantity)”和“QuantityInput.ConstrainBetween(IParameter, IParameter)”
问题分析与需求
我理解这是因为编译器可以将IParameter<Quantity>隐式转换为Quantity,导致两个方法签名都成为候选。
我已知三种解决方式:
- 不重载隐式运算符
- 使用显式运算符替代
- 使用不同的方法名
但我不想选择前两种,因为隐式重载在其他场景的收益大于该弊端,目前打算用第三种方案,但想寻求其他替代方案,比如能否在调用时指定具体的方法签名?
补充说明:必须保留两个方法的原因是,Constraint<Quantity>.Value始终返回相同的Quantity,而Constraint<IParameter<Quantity>>.Value会根据Formula属性在不同时间返回不同的Quantity,两种约束的行为完全不同,缺一不可。
内容的提问来源于stack exchange,提问作者MonkeyFace
相关产品推荐
相关产品推荐

