C# Char到int隐式幕后转换
以下内容在c中有效,因为C# Char到int隐式幕后转换,c#,operators,implicit-conversion,C#,Operators,Implicit Conversion,以下内容在c中有效,因为Char可以隐式转换为int int i = 'a'; 我只是好奇.Net Framework在幕后做了什么,我查看了char和int类型的源代码,但找不到它的编写位置 有人能解释幕后发生了什么吗 正如@shahwat和@joannovo所说,它是将存储在i中的ASCII值 看这个, char value = 'a'; Console.WriteLine(value); Console.WriteLine((int)value);
Char
可以隐式转换为int
int i = 'a';
我只是好奇.Net Framework在幕后做了什么,我查看了char
和int
类型的源代码,但找不到它的编写位置
有人能解释幕后发生了什么吗 正如@shahwat和@joannovo所说,它是将存储在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)
编辑:在此microsoft参考资料中,您可以找到每个方法的实现。
只需单击特定的方法,您将被导航到该方法的定义 您还可以添加与您的需求相关的特定VS扩展
例如:
通过这种方式,您将在您的VS中拥有一个功能,您可以通过正确地点击方法并选择“转到定义”来查看实现 对于您的场景
int i ='a';
从某种意义上讲,这不是一种真正的方法。要查看其实现,必须使用 我不确定在Resharper的情况下这是否可能,但我刚刚提供了一种方法,您可以通过它来完成这项工作。希望这将对您有所帮助 以下是您的场景的分步指南:
1.在此安装环境(安装VS,Roslyn)
2.启用.NET Framework源代码调试(如果默认情况下未启用)
3.在对账单上加一个断点
int i='a'
4.按f11单步执行此语句后面编写的所有实现 这就是你要做的 重要注意事项:
我想补充一点,如果上述方法不适用于您,那么它将与MSIL相关。因此,在这种情况下,您需要分析Roslyn从该代码生成的内容。
如果是这种情况,那么您也可以使用任何Reflector工具检查它,该工具将显示生成的MSIL。如@Sadaquat所示,.NET基本类型的源代码位于 您正在讨论的具体实现可能是 它只是返回,它本身只是返回值,因为
char
s在幕后是整数值。在C#中,我们有一个称为单根统一类型系统的东西。这意味着每个现有类型都是一个根类型的子类型<代码>对象在C#中。因此char
或int
只是System.char
和System.Int32
的缩写(别名)。从非类型化的对象
到长
或字符
(值类型)的转换称为(非)装箱
与Java相比,这是一个真正的区别,Java中有基本类型int
,char
。。还有对象
。像Int
这样的Java类正在包装基元类型
因为在C#中,一切都是一个对象
(我是对象,因为我们很多!),所有的值类型都实现了IConvertible
,正如其他人所说
还有一个内部使用最多的enumTypeCode
,它是分配给像int
这样的值类型对象的运行时反射信息。Convert.To
方法正在使用此类型信息来完成其工作
mscorlib(系统名称空间)可以在github上的
此外,由于值类型是完整对象(struct),因此在运行时可以使用大量类型/元信息
C是一个安全的(ER)语言,与C++相比。它不允许不安全的impilict强制转换
从char
到int
的转换是加宽
Int
比char
大/有更多的空间。投球是安全的
但这就是为什么它不同于Joanvo所写的(int)
。
这是一个显式的强制转换,无论安全与否,你都在强迫.Net这样做
对于inti='a'代码>由于加宽,可以进行隐式转换。
但是如果你尝试charc=42代码>Visual Studio和编译器将不允许此操作。除非您在意识到可能并非来自int
的所有信息都适合char
这也是为什么不能在if中使用与布尔(表达式)不同的内容的原因
在C/C++中,您可以编写if(1){}
或if(0){}
。这在C#中是不允许的,在C#中,如果(..==1){}
,则必须编写。在C/C++中,这通常用于检查指针是否为空
您可以为自己的类型重载隐式
和显式
运算符,这有时很有用。至少知道这是可能的是有用的。
无法说明幕后是如何操作的,但其ASCII值将存储在i
中。它在C/C++中也以同样的方式工作。我试图查看它的源代码,看看C#编译器开源上到底发生了什么?我猜新的roslyn是开源的。当你找到它时,请指出代码。你的意思是我们看不到dll的源代码???@EhsanSajjad我的意思是visual studio没有内置功能来显示这些dll的源代码,但是有很多软件可以查看dll中写的内容。还可以看到这个@Sadaquat我正在使用Resharper查看Char
和int
types@EhsanSajjad那么,您在使用Resharper时面临什么问题呢?我无法找到实现它的地方