以下内容在c#中有效,因为Char
可以隐式转换为int
int i = 'a';
我只是对.Net Framework在幕后做什么感到好奇,我查看了char
和int
类型的源代码但无法找到它的编写位置。
任何机构都可以解释幕后发生的事情吗?
答案 0 :(得分:5)
在C#中,我们有一种称为单根统一类型系统的东西。这意味着每个现有类型都是一个根类型的子类型。 C#中的Object
。因此char
或int
仅为System.Char
和System.Int32
的短(别名)。从无类型Object
到long
或char
(值类型)的转换称为(un)boxing
。
与 Java 相比,这是一个真正的区别,其中有基本类型int
,char
..并且有Object
。像Int
这样的Java类正在包装基本类型。 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演员。从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
答案 1 :(得分:3)
由于@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)
修改强>
microsoft
在这个微软参考上你可以找到每种方法的实现
只需要点击特定方法,您就可以导航到该方法的定义。
您还可以添加与您的要求相关的特定VS扩展
例如:
Download VS extensions
通过这种方式,你可以在你的VS中拥有一个功能,你可以通过恰当地选择方法并选择“Go to Defination”来看到实现
适用于您的场景
int i ='a';
这不是一种真正的方法(在某种意义上) 要查看其实现,您必须使用 roslyn
我不确定在Resharper的情况下这是否可能,但我刚刚提供了一种方法可以让你完成这件事。希望这对你有所帮助。
以下是您的方案的分步指南:
1.设置环境(安装VS,Roslyn)这里
roslyn
2.Enable .NET Framework Source debug(如果默认情况下未启用)
Enable Source Debug
3.在你的陈述int i='a'
上设一个断点
4.按f11逐步执行本声明后面的所有实现。
这就是你所要做的一切。
Imp注意:
我想补充一点,如果上面的方法对你不起作用,那么它将与MSIL相关。所以在这种情况下你需要分析Roslyn从这段代码生成的内容。
如果是这种情况,那么您也可以使用任何反射器工具进行检查,该工具将显示生成的MSIL。
答案 2 :(得分:1)
.NET基元类型的源代码位于http://referencesource.microsoft.com/,如@Sadaquat所示。
您所谈论的具体实施可能是implementation of IConvertable.ToInt32()
from the Char
struct。
只返回Convert.ToInt32(char value)
,它本身只返回值,因为char
s是幕后的整数值。