Char to int隐式演员幕后故事

时间:2015-08-19 11:45:59

标签: c# operators implicit-conversion

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

int i = 'a';

我只是对.Net Framework在幕后做什么感到好奇,我查看了charint类型的源代码但无法找到它的编写位置。

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

3 个答案:

答案 0 :(得分:5)

在C#中,我们有一种称为单根统一类型系统的东西。这意味着每个现有类型都是一个根类型的子类型。 C#中的Object。因此charint仅为System.CharSystem.Int32的短(别名)。从无类型Objectlongchar(值类型)的转换称为(un)boxing

Java 相比,这是一个真正的区别,其中有基本类型intchar ..并且有Object。像Int这样的Java类正在包装基本类型。 https://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java

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

还有一个主要内部使用的枚举TypeCode,它是分配给值类型对象的运行时反射信息,如intConvert.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演员。

charint的演员阵营是wideningIntchar更大/有更多空间。施放是安全的。

但这就是为什么它和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 的指针。

您可以为自己的类型重载implicitexplicit运算符,这有时非常有用。至少知道它是有用的。 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是幕后的整数值。