在幕后隐式转换Char到int
本文关键字:Char int 转换 | 更新日期: 2023-09-27 18:08:46
在c#中有效,因为Char
可以隐式转换为int
int i = 'a';
我只是好奇。net框架在幕后做什么,我看了看char
和int
类型的源代码,但无法找到它写的地方。
有谁能解释幕后发生了什么吗?
在c#中,我们有一个叫做单根统一类型系统的东西。这意味着每个现有类型都是一个根类型的子类型。c#中的Object
。因此,char
或int
只是System.Char
和System.Int32
的简称(别名)。从未类型化的Object
到long
或char
(值类型)的转换称为(un)boxing
。
与Java相比,这是一个真正的区别,Java有基本类型int
, char
..这是Object
。像Int
这样的Java类正在包装基本类型。https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java
因为在c#中一切都是Object
(我是对象,因为我们有很多!),所有的值类型都实现了IConvertible
,正如其他人所说的。
还有一个内部使用的enum TypeCode
,它是分配给值类型对象(如int
)的运行时反射信息。Convert.To
方法使用这些类型信息来完成它们的工作。
http://referencesource.microsoft.com/mscorlib/系统/convert.cs
mscorlib(系统命名空间)可以在github的https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System下找到
由于值类型是完整对象(结构体),因此在运行时可以使用大量的类型/元信息。
例如,与c++相比,c#是一种更安全的语言。它不允许不安全的隐式强制转换。从char
到int
的强制转换是widening
。Int
比char
有更多的空间。投硬币是安全的。
但这就是为什么它不像Joanvo写的(int) 'a'
一样。这是一个显式强制类型转换,无论它是否安全,你都强迫。net这样做。
对于int i = 'a';
,由于扩展,可以进行隐式强制转换。但如果你尝试char c = 42;
Visual Studio和编译器将不允许它。除非您强制使用显式强制转换,同时意识到int
中的所有信息可能不适用于char
这也是为什么你不能在if中使用布尔(表达式)以外的东西。
在C/c++中可以写if(1) { }
或if(0) {}
。这在c#中是不允许的,你必须写if(..==1) {}
。在C/c++中,这通常用于检查指针null。
可以为自己的类型重载implicit
和explicit
操作符,这有时很有用。至少知道这是可能的是有用的。https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx
正如@shahwat和@joanvo所说的,这是将存储在i中的ASCII值。
看到这个,
char value = 'a';
Console.WriteLine(value);
Console.WriteLine((int)value);
Console.WriteLine(value == 'y');
Console.WriteLine(value.GetType());
Console.WriteLine(typeof(char));
Console.WriteLine((int)char.MinValue);
Console.WriteLine((int)char.MaxValue);
Out Put:
a
97 (Integer value of char)
False
System.Char
System.Char
0 (MinValue as an integer)
65535 (MaxValue as an integer)
编辑:
微软
在这个微软参考中,你可以找到每个方法的实现。
只需要点击特定的方法,你就会被导航到该方法的定义。
您还可以添加与您的需求相关的特定VS扩展
例:
下载VS扩展
通过这种方式,你可以在你的VS中拥有一个功能,你可以通过右键单击方法并选择"Go to definition"来查看实现。
对于您的场景
int i ='a';
这实际上不是一个方法(在某种意义上)。
要查看其实现,必须使用roslyn
我不确定这是否可能在Resharper的情况下,但我刚刚提供了一种方法,你可以做到这一点。希望这能对你有所帮助。
下面是针对您的场景的一步一步指南:
1.设置环境(安装VS,Roslyn)在这里
roslyn
2.启用。net Framework源代码调试(如果默认未启用)
启用源代码调试
3.在语句int i='a'
上设置断点4.按f11一步执行语句后面编写的所有实现。
这就是你所要做的。
Imp注意:
我想再加一件事,如果上面的方法不适合你,那么它将是与MSIL相关的东西。因此,在这种情况下,您需要分析Roslyn从此代码生成的内容。
如果是这样的话,你也可以用任何反射器工具检查一下,它会显示生成的MSIL
. net基本类型的源代码在http://referencesource.microsoft.com/,如@Sadaquat所示。
你说的具体实现可能是Char
结构体对IConvertable.ToInt32()
的实现。
简单地返回Convert.ToInt32(char value)
,它本身简单地返回值,因为char
s在幕后是整数值。