首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.Net隐式转换指南

.Net隐式转换指南
EN

Stack Overflow用户
提问于 2008-12-23 21:28:29
回答 4查看 2K关注 0票数 3

什么时候用户定义的隐式转换可以定义,应该定义,或者不应该定义,一般的指导原则是什么?

我的意思是,例如,“隐式转换永远不应该丢失信息”,“隐式转换永远不应该抛出异常”,或者“隐式转换永远不应该实例化新的对象”。我非常确定第一个是正确的,第三个是不正确的(或者我们只能隐式转换为结构),而我不知道第二个是什么。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2008-12-23 21:45:38

第一个并不像你想象的那么简单。下面是一个例子:

代码语言:javascript
运行
复制
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);        
    }
}

就我个人而言,我很少创建自己的隐式转换。我对框架中的那些很满意,但我很少觉得添加自己的框架会让生活变得更好。(一般来说,值类型也是如此。)

编辑:实际上回答一下这个问题,可能值得阅读conversion operators part of the Microsoft class library design guidelines

票数 14
EN

Stack Overflow用户

发布于 2008-12-23 21:33:45

我绝对同意第一种方法--第二种方法(“永不说永远不会”),但不会因为第三种方法而兴奋;除此之外,它在结构和类之间产生了不必要的区别。在某些情况下,使用隐式转换可以极大地简化调用约定。

对于显式转换,所有事情都是可能的。

不过,您并不经常需要编写转换运算符。在许多情况下,显式运算符更有用,因为它们可以在条件不正确时中断(例如,对于Nullable<T>,如果它们没有值)。

票数 2
EN

Stack Overflow用户

发布于 2013-09-04 07:50:50

如果你只支持自己类型的对象之间的隐式转换,我建议你应该决定什么“公理”应该应用于这样的转换(例如,如果a==bb==ca==c都是合法的,其中两个是真的,那么第三个也必须是真的),然后确定一组最有用的转换,使这些公理成立。我在我的博客http://supercatnet.blogspot.com/2013/09/axioms-of-implicit-type-conversion.html上讨论了四个有用的公理(不幸的是,.NET框架包含了违反这四个公理的转换,而不允许不需要的转换)。

要考虑的重要一点是,在大多数情况下,隐式转换到不精确类型的风险比从不精确类型转换的风险要小,但有一个明显的例外:如果将某种更精确的类型提供给具有重载的方法或运算符,该方法或运算符同时接受更精确的类型和可以转换为的较不精确的类型,则几乎不可避免地会出现某种程度的“惊人”行为,除非可以使隐式转换变得不可能[例如,程序员编写if (someLong == someFloat)的行为可能令人惊讶,但这并不是因为隐式longfloat转换的精度损失是惊人的,而是因为至少有六种不同的方法可以比较longfloat(*),并且编译器可能附加到直接比较的任何含义都会让那些期望其他东西的人感到惊讶。我所知道的避免这种惊讶的唯一解决方案是提供重载来显式地覆盖所有不明确的情况,并用[Obsolete()]标记来标记它们。这样做可能会有些笨拙,但将提供能够满足所有四个公理的实质性优势。

(*)程序员可能想要测试long是否等于四舍五入到最近的浮点值、向零截断或向负无穷大的浮点值;或者,程序员可能想要测试float是否代表longfloatlong是否具有相同的额定值,或者floatlong是否都会转换为相同的double

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档