【问题标题】:Char to int implicit cast Behind the ScenesChar 到 int 隐式转换幕后
【发布时间】:2015-08-19 11:45:58
【问题描述】:

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

int i = 'a';

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

谁能解释幕后发生的事情?

【问题讨论】:

  • 不能说它是如何在幕后完成的,但它的 ASCII 值将存储在i 中。它在 C/C++ 中的工作方式也相同。
  • 我正在尝试查看它的源代码以了解实际情况
  • C# 编译器是开源的吗?我猜新的roslyn 是开源的。找到后请指出代码。

标签: c# operators implicit-conversion


【解决方案1】:

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

Java 相比,这是一个真正的区别,其中有基本类型 int,char.. 和 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(系统命名空间)可以在github上的https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System下找到

此外,由于值类型是完整的对象(结构),因此在运行时可以使用大量类型/元信息。

例如,与 c++ 相比,C# 是一种更安全的语言。它不允许不安全的隐式强制转换。

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

【讨论】:

    【解决方案2】:

    正如@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
    在这个 microsoft 参考中,您可以找到每个方法的实现。
    只需点击特定的方法,您将被导航到该方法的定义。

    您还可以添加与您的要求相关的特定 VS 扩展
    例如:
    Download VS extensions
    通过这种方式,您将在您的 VS 中拥有一个功能,您可以通过正确点击方法并选择“转到定义”来查看实现

    适合你的场景

    int i ='a';  
    

    这并不是真正的方法(在某种意义上)。
    要查看其实现,您必须使用 roslyn

    我不确定在 Resharper 的情况下这是否可行,但我刚刚提供了一种完成此操作的方法。希望这对您有所帮助。

    以下是针对您的方案的分步指南:
    1.设置环境(安装VS,Roslyn)这里
    roslyn
    2.启用 .NET Framework Source 调试(如果默认未启用)
    Enable Source Debug
    3.在你的语句上打断点int i='a'
    4.按 f11 单步执行此语句后面编写的所有实现。

    这就是你所要做的。

    提示:
    我想再补充一件事,如果上述方法对您不起作用,那么它将与 MSIL 相关。所以在这种情况下,您需要分析 Roslyn 从该代码生成的内容。
    如果是这种情况,那么您还可以使用任何可以向您显示生成的 MSIL 的 Reflector 工具进行检查。

    【讨论】:

    • 你的意思是说我们看不到dll的源代码??
    • @EhsanSajjad 我的意思是 Visual Studio 没有内置功能来显示这些 dll 的源代码,但是有很多软件可以查看用 dll 编写的内容。看到这个jetbrains.com/decompilerilspy.net这个还有filegenreflector.codeplex.com
    • @Sadaquat 我正在使用 Resharper 查看Charint 类型的源代码
    • @EhsanSajjad 那么您在使用 Resharper 时遇到什么问题?
    • 我无法找到完成的实现
    【解决方案3】:

    .NET 原始类型的源代码位于http://referencesource.microsoft.com/,如@Sadaquat 所示。

    你说的具体实现可能是implementation of IConvertable.ToInt32() from the Char struct

    这只是返回Convert.ToInt32(char value),它本身只是返回值,因为chars 是幕后的整数值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      • 2011-10-24
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2011-05-01
      • 2020-01-04
      相关资源
      最近更新 更多