在C#中将char隐式类型转换为int

时间:2009-10-01 11:36:26

标签: c#

我对隐式类型转换有疑问

为什么这种隐式类型转换在C#中有效?我已经知道隐式代码通常不起作用。

我这里有一个关于隐式类型转换的代码示例

 char c = 'a';
 int x = c;
 int n = 5;
 int answer = n * c;
 Console.WriteLine(answer);

9 个答案:

答案 0 :(得分:74)

答案 1 :(得分:12)

基本思想是导致潜在数据丢失的转换可能是隐含的,而可能导致数据丢失的转换必须是显式的(例如,使用强制转换运算符)。

因此隐式地从char转换为int将在C#中有效。

[编辑]正如其他人所指出的,char是C#中的16位数,所以这种转换只是从16位整数到32位整数,这可能没有数据 - 损失。[/编辑]

C#支持隐式转换,“通常不起作用”的部分可能来自其他语言,可能是C ++,其中一些光荣的string实现提供了对各种指针类型的隐式转换,从而产生了一些巨大的错误在应用程序中。

当您使用任何语言提供类型转换时,默认情况下也应默认为显式转换,并且仅针对特殊情况提供隐式转换。

答案 2 :(得分:9)

来自C#规范

  

6.1.2隐式数字转换   隐式数字转换是:

     

•从sbyte到short,int,long,   float,double或decimal。

     

•从byte到short,ushort,int,   uint,long,ulong,float,double,或   小数。

     

•从short到int,long,float,   加倍或小数。

     

•从ushort到int,uint,long,   ulong,float,double或decimal。

     

•从int到long,float,double或   小数。

     

•从uint到long,ulong,float,   加倍或小数。

     

•从长到浮动,加倍或   小数。

     

•从ulong到float,double或   小数。

     

•从char到ushort,int,uint,   long,ulong,float,double,或   小数。

     

•从浮动到双倍。

     

来自int,uint,long或的转换   ulong浮动,从长或ulong   加倍可能导致损失   精确,但永远不会造成损失   数量级。另一个暗示   数字转换永远不会丢失   信息。没有隐含的   转换为char类型,所以   其他整数类型的值   不会自动转换为char   类型。

答案 3 :(得分:4)

在MSDN页面上关于char(char (C# Reference)

  

char可以隐式转换为ushort,int,uint,long,ulong,float,double或decimal。但是,没有从其他类型到char类型的隐式转换。

这是因为他们已经从char到所有这些类型实现了implicit method。现在,如果你问他们为什么实现它们,我真的不确定,当然是为了帮助使用字符的ASCII表示或类似的东西。

答案 4 :(得分:1)

投射会导致数据丢失。这里char是16位,int是32位。因此演员阵容将在不丢失数据的情况下发生。

现实生活中的例子:如果没有外界帮助,我们可以将一艘小船放入一艘大船,但不能反过来。

答案 5 :(得分:0)

它的作用是因为每个字符都在内部作为数字处理,因此转换是隐式的。

答案 6 :(得分:0)

char被隐式地转换为它的Unicode数值,这是一个整数。

答案 7 :(得分:0)

在我看来,从char到数字类型的隐含转换是没有意义的,因为信息丢失了。您可以从此示例中看到它:

string ab = "ab";
char a = ab[0];
char b = ab[1];
var d = a + b;   //195

我们已将字符串中的所有信息都放入字符中。如果只保留来自d的信息,那么留给我们的所有信息都是一个在这种情况下没有意义的数字,不能用于恢复以前提供的信息。因此,最有用的方法是将字符的“总和”隐含地转换为字符串。

答案 8 :(得分:0)

@Eric Lippert的blog entry的核心是他对c#语言设计师做出此决定背后的推理的有根据的猜测:

"There is a long tradition in C programming of treating characters as integers 
-- to obtain their underlying values, or to do mathematics on them."

它可能会导致错误,例如:

var s = new StringBuilder('a');

您可能会以but actually sets the capacity of the StringBuilder to 97开头的'a'字符来初始化StringBuilder。