铸造和胁迫有什么区别?

Ale*_*lin 78 c# oop

我已经看到这两个术语在各种在线解释中几乎可以互换使用,我咨询过的大多数教科书也不完全清楚这种区别.

是否有一种清晰而简单的方式来解释你们所知道的差异?

类型转换(有时也被称为类型转换)

在期望另一个的上下文中使用一种类型的值.

非转换类型转换(有时称为类型双关语)

不会改变基础位的更改.

强迫

当周围上下文需要第二种类型时,编译器自动将一种类型的值转换为另一种类型的值的过程.

Igo*_*Oks 101

类型转换:

单词转换是指隐式或显式地将值从一种数据类型更改为另一种数据类型,例如16位整数到32位整数.

胁迫用于表示的隐式转换.

单词cast通常是指显式类型转换(与隐式转换相对),无论这是对位模式还是实际转换的重新解释.

因此,强制是隐含的,强制转换是明确的,转换是任何一种.


几个例子(来自同一来源):

强制(隐含):

double  d;
int     i;
if (d > i)      d = i;
Run Code Online (Sandbox Code Playgroud)

演员(明确):

double da = 3.3;
double db = 3.3;
double dc = 3.4;
int result = (int)da + (int)db + (int)dc; //result == 9
Run Code Online (Sandbox Code Playgroud)


Eri*_*ert 22

正如您所注意到的,用法各不相同.

我的个人用法是:

  • "强制转换"是强制转换运算符的用法.转换运算符指示编译器(1)此表达式不知道是给定类型,但我保证在运行时该值将是该类型; 编译器将表达式视为给定类型,如果不是,运行时将产生错误,或者(2)表达式完全不同,但是有一种众所周知的关联实例的方法具有cast-to类型实例的表达式类型.指示编译器生成执行转换的代码.细心的读者会注意到这些是对立的,我认为这是一个巧妙的伎俩.

  • "转换"是一种操作,通过该操作,一种类型的值被视为另一种类型的值 - 通常是不同的类型,但从技术上讲,"身份转换"仍然是转换.转换可以是"表示更改",例如int to double,或者它可能是"表示保留",如字符串到对象.转换可以是"隐式的",不需要强制转换或"显式",这需要强制转换.

  • "强制"是表示改变的隐式转换.


Ped*_*C88 7

转换是将对象类型视为另一种类型的过程,Coercing将一个对象转换为另一个对象.

请注意,在前一个过程中没有涉及转换,您有一个类型,您希望将其视为另一个,例如,您有3个不同的对象从基类型继承,并且您有一个方法将采用该类型基本类型,在任何时候,如果你现在是特定的子类型,你可以将它CAST到它是什么,并使用该对象的所有特定方法和属性,并且不会创建该对象的新实例.

另一方面,强制意味着在新类型的内存中创建一个新对象,然后将原始类型复制到新类型,将两个对象留在内存中(直到垃圾收集器取走或两者都有) .

  • 一个例子将有助于澄清你想要做出的区别. (2认同)