隐式运算符导致方法签名解析不明确

问题描述 投票:0回答:1

我有以下方法:

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. 使用两个不同的方法名称

我不想选择 1 或 2,因为隐式重载在其他地方的好处超过了这个缺点。

我目前打算采取策略(3)并使用不同的签名名称。

我发布这个问题只是为了以防万一有另一种方法可以让我鱼与熊掌兼得?例如,是否有某种方法可以在调用中准确指定方法签名来调用它?

c# implicit-conversion ambiguous-call
1个回答
0
投票

如果你的

IParameter<Quantity>
被正确设计为我隐式转换为
Quantity
,那么你不应该需要第二个方法ConstrainBetween。
IParameter
似乎也只是一个简单的 DTO,携带单个值,而不是其他任何东西。

所以,我的解决方案是完全删除

public void ConstrainBetween(IParameter<Quantity> min, IParameter<Quantity> max)

© www.soinside.com 2019 - 2024. All rights reserved.