chr*_*ssr 80
转换是一种告诉编译器的方法"对象X实际上是Y型,继续进行处理."
转换是说"我知道对象X不是Y型,但是存在一种从Y型X创建新对象的方法,继续执行它."
Jus*_*ner 45
我相信Eric想要说的是:
转换是一个描述语法的术语(因此是句法含义).
转换是一个术语,描述幕后实际采取的行动(以及语义含义).
cast-expression用于将表达式显式转换为给定类型.
和
形式为(T)E的强制转换表达式,其中T是一个类型而E是一元表达式,它执行E的值到类型T的显式转换(第13.2节).
似乎通过说语法中的强制转换操作符执行显式转换来支持它.
Eri*_*ert 42
我想起理查德·费曼所讲的轶事,他正在参加一个哲学课,教授问他"费曼,你是一个物理学家,你认为电子是一个'必不可少的对象'?" 所以费曼问澄清问题"砖块是一个必不可少的东西吗?" 上课.每个学生对这个问题都有不同的答案.他们说,"砖"的基本抽象概念是必不可少的对象.不,一个特定的,独特的砖是必不可少的对象.不,你可以凭经验观察到的砖块部分是必不可少的.等等.
这当然不是回答你的问题.
我不打算通过所有这些十几个答案,并与作者讨论我的真正含义.几个星期后我会写一篇关于这个主题的博客文章,我们会看看是否会对这个问题有所了解.
但是,费曼如何进行类比.你想在周六早上烤一条香蕉面包(就像我几乎每个星期六早上一样.)所以你咨询烹饪的喜悦,它说"等等等等......在另一个碗里,把干的成分搅拌在一起." .."
显然,明天早上该指令与你的行为之间存在着密切的关系,但同样明确的是,将指令与行动混为一谈是错误的.该指令由文本组成.它在特定页面上有一个位置.它有标点符号.如果你在厨房里一起搅拌面粉和小苏打,有人问"你现在的标点是什么?",你可能认为这是一个奇怪的问题.该操作与指令有关,但指令的文本属性不是操作的属性.
演员不是转换,就像配方不是烘烤蛋糕的行为一样.配方是描述操作的文本,然后您可以执行该操作.强制转换操作符是描述操作的文本 - 转换 - 运行时可以执行该操作.
来自C#Spec 14.6.6:
cast-expression用于将表达式显式转换为给定类型.
...
形式为(T)E的强制转换表达式,其中T是一个类型而E是一元表达式,它执行E的值到类型T的显式转换(第13.2节).
因此,cast是一种语法结构,用于指示编译器调用显式转换.
来自C#Spec§13:
转换允许将一种类型的表达式视为另一种类型.转换可以是隐式或显式的,这决定了是否需要显式转换.[示例:例如,从int类型到long类型的转换是隐式的,因此int类型的表达式可以隐式地被视为long类型.从long类型到int类型的相反转换是显式的,因此需要显式转换.
因此,转换是实际工作完成的地方.您会注意到,cast-expression引用它表示它执行显式转换,但显式转换是隐式转换的超集,因此您也可以通过强制转换表达式调用隐式转换(即使您不需要).
只是我的理解,可能太简单了:
当投射基本数据时保持不变(相同的内部表示) - "我知道这是一个字典,但你可以将它用作ICollection".
转换时,您将内部表示更改为其他内容 - "我希望此int为字符串".
阅读Eric的评论之后,尝试用简单的英语:
转换意味着这两种类型在某种程度上实际上是相同的.它们可以实现相同的接口或从相同的基类继承,或者目标可以"相同"(超集?)以使转换工作,例如从Int16转换为Int32.
然后转换类型意味着两个对象可能足够相似以进行转换.以数字的字符串表示为例.它是一个字符串,它不能简单地转换为数字,需要进行解析并从一个转换为另一个,并且该过程可能会失败.它也可能因铸造而失败,但我认为这是一个更便宜的失败.
这就是我认为的两个概念之间的关键区别.转换需要对源数据进行某种解析或更深入的分析和转换.转换不解析.它只是尝试在某些多态级别进行匹配.
| 归档时间: |
|
| 查看次数: |
16105 次 |
| 最近记录: |