什么是关于何时,应该或不应该定义用户定义的隐式转换的一般指导原则?
我的意思是,例如,"隐式转换永远不会丢失信息","隐式转换永远不应该抛出异常",或"隐式转换永远不应该实例化新对象".我很确定第一个是正确的,第三个不是(或者我们只能隐式转换为结构),而我不知道第二个.
第一个并不像你想象的那么简单.这是一个例子:
using System; class Test { static void Main() { long firstLong = long.MaxValue - 2; long secondLong = firstLong - 1; double firstDouble = firstLong; double secondDouble = secondLong; // Prints False as expected Console.WriteLine(firstLong == secondLong); // Prints True! Console.WriteLine(firstDouble == secondDouble); } }
就个人而言,我很少创建自己的隐式转换.我对框架中的那些人感到高兴,但我很少觉得添加自己的东西会让生活更美好.(一般来说,值类型也是如此,顺便说一句.)
编辑:只是为了实际回答这个问题,可能值得阅读微软类库设计指南中的转换运算符部分.