Char to int隐式演员幕后故事

Ehs*_*jad 3 c# operators implicit-conversion

以下内容在c#中有效,Char可以隐式转换为int

int i = 'a';
Run Code Online (Sandbox Code Playgroud)

我只是对.Net Framework在幕后做什么很好奇,我查看char并输入int源代码但无法找到它的编写位置.

任何机构都可以解释幕后发生的事情吗?

Mur*_*fal 5

在C#中,我们有一种称为单根统一类型系统的东西.这意味着每个现有类型都是一个根类型的子类型.Object在C#中.所以char或者int只是短(别名)System.CharSystem.Int32.调用从无类型转换Objectlongchar(值类型)的转换(un)boxing.

与存在基本类型的Java相比,这是一个真正的区别int,char并且存在Object.类似的Java类Int包装了原始类型.https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java

因为在C#中,一切都是Object(我是对象,因为我们很多!),所有的值类型都实现了IConvertible,正如其他人所说的那样.

并且有一个主要是内部使用的枚举TypeCode,它是分配给值类型对象的运行时反射信息int.该Convert.To方法正在使用此类型信息来完成其工作.

http://referencesource.microsoft.com/#mscorlib/system/convert.cs

mscorlib(系统名称空间)可以在https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System下的github上找到

此外,因为值类型是完整对象(struct),所以在运行时期间可以获得许多类型/元信息.

例如,与c ++相比,C#是一种安全(呃)语言.它不允许不安全的impilict演员.

从演员阵容charintwidening.Int更大/有更多空间char.施放是安全的.

但这就是为什么它(int) 'a'与Joanvo写的不一样.这是一个明确的演员,你强迫.Net去做,不管它是否安全.

对于int i = 'a';it's细做,因为扩大的隐式转换.但是,如果您尝试char c = 42;Visual Studio,编译器将不允许它.除非你强制使用明确的演员,同时意识到可能不是所有信息int都适合char

这也是为什么你不能在if中使用不同于布尔(表达式)的东西的原因.

在C/C++中你可以写if(1) { }if(0) {}.在C#中不允许这样做,你必须写if(..==1) {}.在C/C++中,这通常用于检查指针是否为null.

您可以为自己的类型重载implicitexplicit运算符,这有时很有用.至少知道它是有用的. https://msdn.microsoft.com/en-us/library/z5z9kes2.aspx