显式和隐式类型转换之间有什么区别?

Vij*_*dra 39 c#

你能解释一下explicitimplicit类型演员之间的区别吗?

Mar*_*ell 50

这有点棘手,因为C#中的"强制转换"语法实际上做了一系列不同的事情(强制转换,原始转换,定制转换等)

在隐式转换中,两者之间存在明显的参考保留转换:

List<int> l = new List<int>();
IList<int> il = l;
Run Code Online (Sandbox Code Playgroud)

编译器可以通过静态分析证明这是安全的(List<int>总是一个IList<int>)

通过明确的演员表,要么你告诉编译器你知道的比它更多 - "请相信我,但无论如何都要检查":

List<int> l = new List<int>();
IList<int> il = l;
List<int> l2 = (List<int>)il;
Run Code Online (Sandbox Code Playgroud)

虽然这种演员是可能的,但编译器不会接受所有 IList<int> s实际上List<int>- 所以我们必须告诉它让它通过.


在隐式原始转换(由语言规范提供)中,通常假设存在安全,无风险,无损(警告:参见Jon的评论)转换:

int i = 1;
float f = i;
Run Code Online (Sandbox Code Playgroud)

使用显式的原始转换,转换可能会丢失数据,或者不明显:

float f = 1;
int i = (int)f;
Run Code Online (Sandbox Code Playgroud)

对于定制的运营商,所有的赌注都已关闭,您必须查看文档.它可以是参考演员,也可以是任何东西.它可能遵循类似于原始转换的规则(例如:) decimal,或者它可以随机执行任何操作:

XNamespace ns = "http://abc/def"; // implicit
XAttribute attrib = GetAttrib();
int i = (int)attrib; // explicit (extracts text from attrib value and
                     // parses to an int)
Run Code Online (Sandbox Code Playgroud)

这两个都运行特定于上下文的自定义代码.

  • 我碰巧查过的规范参考 - 6.1.2:“从 int、uint、long 或 ulong 到 float 以及从 long 或 ulong 到 double 的转换可能会导致精度损失,但永远不会导致幅度损失. 其他隐式数字转换永远不会丢失任何信息。” (2认同)

Eri*_*ert 17

美国总统和加拿大总统有什么区别?

由于没有加拿大总统,很难回答这个问题.正确的做法是推迟并要求澄清问题.对于"加拿大总统",提问者是指女王(礼仪国家元首),总督(可以否决票据)还是总理(实际上是行政人员)或其他什么?很难说没有澄清.

即使有澄清,这也是一个模糊的问题.你想知道什么不同?

由于在C#中没有"隐式演员"这样的东西,很难回答你的问题.在C#中,铸造是一个操作员.所以我会推迟它.

你的意思是问"显式转换和隐式转换之间有什么区别?" 或者你的意思是询问演员操作符的语义?或者演员和其他类型转换运算符之间的区别?或者编译器可以"隐式"将转换操作符插入到代码中的情况?(例如,foreach循环和+ =运算符都可以隐式插入一个不可见的强制转换.)

你能澄清一下这个问题吗?你要求比较两件事,你感兴趣的是什么样的差异?

您可以考虑阅读C#规范的"转换"一章.如果您对转换有任何疑问,那么很有可能.


Cam*_*and 9

int i = 2;

float a = i;        // Implicit
float b = (float)i; // Explicit
Run Code Online (Sandbox Code Playgroud)