隐含运算符 - 何时是好/坏主意?

时间:2009-11-23 11:17:01

标签: c# implicit

我正在开发一个应用程序,其中Direction(前进/后退)的概念非常重要。

问题是在整个代码库中传播有几种不同的约定:在某些地方它是真/假,在其他地方是+ 1 / -1。

为了尝试将这些结合起来,我创建了:

public class DirectionClass
{ 
     public bool Forwards { get; set; }
     public double Sign { get; set; }
     public EDirection { get; set; }
     //plus associated constructor overloads, implementing IEquatable, etc.
}

我现在想知道隐式转换是好还是坏:

public static implicit operator DirectionClass(double sign);
public static implicit operator DirectionClass(bool forwards); //etc..

以及是否存在我可能会加入的经典陷阱。

2 个答案:

答案 0 :(得分:6)

基本上,在设计标准库时,隐式转换总是一个坏主意。因为如果你突然发现隐式转换中断的情况,你就无法轻易修复它,因为很多人依赖它。

另一方面,如果您负责整个代码库(或至少是您的团队)。只是为了让你的生活更简单。

如果你发现一个它破裂的案例:

  • 你会学到一些东西(总是很好)
  • 您可以退一步修复代码

答案 1 :(得分:4)

一般情况下,在这种情况下你应该没有隐式转换。

隐式转换的经典问题是当人们以转换过程中丢失一些信息的方式实现它时,这会导致整体混乱,如你所能想象的那样(例如,应该相等的东西不再相等,等等) 。但是在你的例子中并非如此。

唯一需要注意的是你在某种程度上丢失了一些类型检查,编译器不会提示你输入错误。