【发布时间】:2009-10-18 07:51:09
【问题描述】:
您能解释一下explicit 和implicit 类型转换之间的区别吗?
【问题讨论】:
-
Too.. many.. guru's.. 回答/评论过.. 这个.. 问题.. 必须.. 离开.. 快点。
标签: c#
您能解释一下explicit 和implicit 类型转换之间的区别吗?
【问题讨论】:
标签: c#
这有点棘手,因为 C# 中的“转换”语法实际上做了一系列不同的事情(转换、原始转换、定制转换等)
在隐式转换中,两者之间存在明显的保留引用转换:
List<int> l = new List<int>();
IList<int> il = l;
编译器可以通过静态分析证明这是安全的(List<int> 始终是 IList<int>)
使用显式强制转换,要么你告诉编译器你知道的比它知道的多 - “请相信我,但无论如何都要检查”:
List<int> l = new List<int>();
IList<int> il = l;
List<int> l2 = (List<int>)il;
尽管这种转换是可能的,但编译器不会接受 all IList<int>s 实际上是 List<int> - 所以我们必须告诉它让它通过.
在隐式原始转换(由语言规范提供)中,通常假定存在安全、无风险、无损失(警告:请参阅 Jon 的评论)的转换:
int i = 1;
float f = i;
使用显式原始转换,转换可能可能丢失数据,或者不明显:
float f = 1;
int i = (int)f;
使用定制运营商,所有赌注都没有了,您必须查看文档。它可以是一个引用转换,也可以是任何东西。它可能遵循与原始转换类似的规则(例如: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)
这两个都运行特定于上下文的自定义代码。
【讨论】:
美国总统和加拿大总统有什么区别?
由于没有加拿大总统,因此很难回答这个问题。正确的做法是回击并要求澄清问题。提问者所说的“加拿大总统”是指女王(礼仪元首)、总督(可以否决法案)或总理(实际上是行政部门),还是其他什么?没有澄清就很难说。
即使经过澄清,这也是一个模糊的问题。您想了解哪些差异?
由于 C# 中没有“隐式强制转换”之类的东西,因此很难回答您的问题。在 C# 中,强制转换是一个运算符。所以我会推回去。
您的意思是要问“显式转换和隐式转换有什么区别?”或者您的意思是询问演员转换运算符的语义?或者强制转换运算符和其他类型转换运算符的区别?或者编译器可以将强制转换运算符“隐式”插入到您的代码中的情况? (例如,foreach 循环和 += 运算符都可以隐式插入不可见的强制转换。)
你能澄清一下这个问题吗?您要求比较哪两件事,您对哪些差异感兴趣?
您可以考虑阅读 C# 规范的“转换”一章。很有可能您对转化的任何问题都能在此处得到解答。
【讨论】:
int i = 2;
float a = i; // Implicit
float b = (float)i; // Explicit
【讨论】:
显式转化
如果不能在没有丢失信息的风险的情况下进行转换,那么它就是显式转换。
例如——
class ExplicitConversions
{
static void Main()
{
int x;
double y = 6358.057;
// Cast double to int.
x = (int)y;
System.Console.WriteLine(x);
}
}
隐式转换
如果可以在没有丢失信息的风险的情况下进行转换,那么它就是隐式转换。不需要特殊语法,因为转换是类型安全的,不会丢失数据。
例如——
class ImplicitConversions
{
static void Main()
{
int x = 6714;
double y;
// Cast int to double.
y = x;
System.Console.WriteLine(y);
}
}
【讨论】:
我认为post 解释得最好。
【讨论】:
显式转换:
int x = 0;
float y = 3.8f;
x += (int) y; //Explicit cast.
这告诉编译器强制转换是有意的,并且您知道小数部分会丢失。编译器不会抱怨。
隐式转换:
int x = 0;
float y = 3.8f;
x += y; //Implicit cast
编译器会报错,因为在将浮点数转换为整数时,小数部分会丢失。
【讨论】:
一个简单的搜索就会在网上提供很多信息。
difference between implicit and explicit type
【讨论】:
类型转换:将一种数据类型转换为另一种数据类型。它可以通过两种方式完成。
隐式类型转换, 显式类型转换
当在程序中遇到混合数据类型表达式时,编译器会自行执行隐式类型转换。它也被称为自动转换,因为它是由编译器在没有程序员帮助的情况下完成的。隐式转换不需要转换运算符。
示例:-
int a=42;
float b=a;
这里 b 将包含 a 的类型转换值,因为在为 b 赋值时,编译器会将 a 的值类型转换为 float,然后将其分配给 b。
显式类型转换由程序员执行。在这种类型转换中,程序员告诉编译器使用类型转换运算符将一种数据类型类型转换为另一种数据类型。但是有一些信息丢失的风险,所以在做的时候需要小心
示例:-
float a=42.12;
int b=(int)a;
在这里,我们将 a 的浮点值显式转换为 int,同时将其分配给 int b。 (int) 是要转换的类型的类型转换运算符。
【讨论】:
从总体上看;这是两种类型的演员之间的区别:
当在程序中遇到混合数据类型表达式时,编译器会自行执行隐式类型转换。它也被称为自动转换,因为它是由编译器在没有程序员帮助的情况下完成的。隐式转换不需要转换运算符。
显式类型转换由程序员执行。在这种类型转换中,程序员告诉编译器使用类型转换运算符将一种数据类型转换为另一种数据类型。但是有一些信息丢失的风险,所以在做的时候需要小心。
您可以参考This article了解更多详情。
【讨论】: