我对隐式类型转换有疑问
为什么这种隐式类型转换在C#中有效?我已经知道隐式代码通常不起作用。
我这里有一个关于隐式类型转换的代码示例
char c = 'a';
int x = c;
int n = 5;
int answer = n * c;
Console.WriteLine(answer);
答案 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)
答案 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。