2010-09-22 129 views

回答

10

首先,这是

What is the difference between casting and conversion?

重复这是由

What is the (type) in (type)objectname.var

启发我会读这些第一,然后回来这个小结。

我是指你本说明书中,其中规定的6章的第一段:

A转换能够 的表达式为是特定类型 的处理。 A转换可能会导致给定类型的 表达式被视为具有不同类型的 ,或 它可能会导致没有 类型的表达式获取类型。转换可以是隐式或显式 ,并且此 可确定是否需要明确转换为 。例如,从int类型到long类型的转换 隐含为 ,因此类型为int 的表达式可以隐式地被视为类型为 long。相反的转换(从 long类型到int类型)是明确的,并且 因此需要显式强制转换。

我们从中学到了什么?

  • 转换是对两个操作数一语义操作表达类型

  • 由语义分析确定的确切操作决定了实际值在运行时如何转换。

  • 是形式(type)expression其中明确从表达式的类型诱导转换的C#语言的句法元件

这些只是几个转换,你可以在C#中做的:

short aa = 123;  // numeric constant conversion from int to short 
int bb = aa;   // numeric conversion from short to int 
int? cc = null;  // nullable conversion from null literal to nullable int. 
object dd = "hello"; // implicit reference conversion from string to object 
IEnumerable<Giraffe> ee = new Giraffe[] { new Giraffe() } ; 
        // implicit reference conversion from array to sequence 
IEnumerable<Animal> ff = ee; 
        // implicit reference conversion involving array covariance 
ff = null;   // implicit reference conversion from null literal to sequence 
bb = 456;   // implicit identity conversion from int to int 
dd = bb;    // implicit boxing conversion from int to object 
Func<int, int> gg = x=>x+x; 
        // anonymous function to delegate type conversion 

明确转换通常,但并非总是如此,需要强制:

aa = (short)bb;  // explicit numeric conversion 
string hh = (string)dd; //explicit reference conversion 

依此类推。

它是合法使用转换进行隐式转换,但通常不是必需的。

这是明确的吗?关键是转换是一个语义操作这导致在运行时的动作cast是一个语法元素,它告诉编译器使用显式转换分析规则分析转换

如果转换逻辑的主题感兴趣的内容,那么你可能有兴趣在我关于这个问题的文章,在这里:

http://blogs.msdn.com/b/ericlippert/archive/tags/conversions/

+1

“显式转换通常但并非总是需要投射”:您可以举一个不需要投射的例子吗?关于我的头顶,我想不出任何... – 2010-09-23 23:11:48

+1

@Thomas:foreach(动物中的长颈鹿)诱导了从动物到长颈鹿的明确转换,没有演员。字节b = 1; b + = 2;引发从int到byte的显式转换;这被分析为b =(字节)((int)b +(int)1))。作为用户定义的显式转换的转换可以在操作数的“任一侧”引入内置的显式转换;在这种情况下,我们确实在源代码中进行了强制转换,但它可以导致最多三次显式转换才能真正执行。 – 2010-09-23 23:39:02

+0

也有一些不太明显的互操作场景,其中编译器会以您的名义插入从接口到类的显式转换。 – 2010-09-23 23:45:38

2

转换=实际转变的对象分成不同的类 前的一个实例:

int i = 3; 
string str = i.ToString(); 

来变换一个整数转换成字符串

铸造=强制对象的类型,因为你知道的比编译器 前更多:

object obj = 3; 
int i = (int)obj; 
0

Here是一个很好的线索,提供一些例子和答案。