我有以下方法:
public void ConstrainBetween(Quantity min, Quantity max)
{
..
}
public void ConstrainBetween(IParameter<Quantity> min, IParameter<Quantity> max)
{
..
}
以下用法会引发以下错误:
HydrModel.TopWaterLevel5yr.ConstrainBetween(OutletPipe.IL, Transform.Z);
HydrModel.TopWaterLevel30yr.ConstrainBetween(OutletPipe.IL, Transform.Z);
产生错误:
以下方法或属性之间的调用不明确:“QuantityInput.ConstrainBetween(Quantity, Quantity)”和“QuantityInput.ConstrainBetween(IParameter, IParameter)”
这在我重载
IParameter<T>
的隐式运算符后开始发生,如下所示:
public class IParameter<T>
{
public T Value;
public static implicit operator T(IParameter<T> p)
{
return p.Value;
}
}
我知道这会导致编译器将
IParameter<Quantity>
隐式转换为 Quantity
使两个方法签名成为潜在目标,并导致 VS 抱怨方法签名不明确
我知道我可以通过以下方式解决歧义问题:
我不想选择 1 或 2,因为隐式重载在其他地方的好处超过了这个缺点。
我目前打算采取策略(3)并使用不同的签名名称。
我发布这个问题只是为了以防万一有另一种方法可以让我鱼与熊掌兼得?例如,是否有某种方法可以在调用中准确指定方法签名来调用它?
如果你的
IParameter<Quantity>
被正确设计为我隐式转换为Quantity
,那么你不应该需要第二个方法ConstrainBetween。 IParameter
似乎也只是一个简单的 DTO,携带单个值,而不是其他任何东西。
所以,我的解决方案是完全删除
public void ConstrainBetween(IParameter<Quantity> min, IParameter<Quantity> max)
。