Char 到 int 隐式转换幕后
Char to int implicit cast Behind the Scenes
以下在 c# 中有效,因为 Char
可以隐式转换为 int
int i = 'a';
我只是好奇 .Net Framework 在幕后做了什么,我查看了 char
和 int
类型的源代码,但无法找到它的编写位置。
任何人都可以解释幕后发生的事情吗?
正如@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 中拥有一个功能,您可以通过右键单击方法并选择 "Go to Defination"
来查看实现
针对您的场景
int i ='a';
这不是真正的方法(在某种意义上)。
要查看其实现,您必须使用
roslyn
我不确定这在 Resharper 的情况下是否可行,但我刚刚提供了一种您可以获得此内容的方法done.Hope这会对您有所帮助。
这是针对您的场景的分步指南:
1.Setup环境(安装VS,Roslyn)在这里
roslyn
2.Enable .NET Framework 源代码调试(如果默认情况下未启用)
Enable Source Debug
3.Put 语句中的断点 int i='a'
4.Press f11 逐步执行此语句后面编写的所有实现。
这就是您要做的所有事情。
小鬼注:
我想再补充一点,如果上述方法对您不起作用,那么它将与 MSIL.So 相关,在这种情况下您需要分析 Roslyn 从该代码生成的内容。
如果是这种情况,那么您还可以使用任何会向您显示生成的 MSIL 的 Reflector 工具进行检查。
.NET 原始类型的源代码位于 http://referencesource.microsoft.com/,如 @Sadaquat 所示。
你说的具体实现大概是implementation of IConvertable.ToInt32()
from the Char
struct.
那只是 returns Convert.ToInt32(char value)
,它本身只是 returns 值,因为 char
是幕后的整数值。
在 C# 中,我们有一个叫做 单根统一类型系统 的东西。这意味着每个现有类型都是一个根类型的子类型。 Object
在 C# 中。所以 char
或 int
只是 System.Char
和 System.Int32
的缩写(别名)。从无类型 Object
到 long
或 char
(值类型)的转换称为 (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(系统名称space)可以在https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System
下的github上找到
此外,由于值类型是完整的对象(结构),因此在运行时可以使用大量 type/meta 信息。
例如,与 C++ 相比,C# 是一种更安全的语言。它不允许不安全的隐式转换。
从 char
到 int
的转换是 widening
。 Int
比 char
bigger/has 多 space。投射是安全的。
但这就是为什么它与 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
以下在 c# 中有效,因为 Char
可以隐式转换为 int
int i = 'a';
我只是好奇 .Net Framework 在幕后做了什么,我查看了 char
和 int
类型的源代码,但无法找到它的编写位置。
任何人都可以解释幕后发生的事情吗?
正如@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 中拥有一个功能,您可以通过右键单击方法并选择 "Go to Defination"
针对您的场景
int i ='a';
这不是真正的方法(在某种意义上)。
要查看其实现,您必须使用
roslyn
我不确定这在 Resharper 的情况下是否可行,但我刚刚提供了一种您可以获得此内容的方法done.Hope这会对您有所帮助。
这是针对您的场景的分步指南:
1.Setup环境(安装VS,Roslyn)在这里
roslyn
2.Enable .NET Framework 源代码调试(如果默认情况下未启用)
Enable Source Debug
3.Put 语句中的断点 int i='a'
4.Press f11 逐步执行此语句后面编写的所有实现。
这就是您要做的所有事情。
小鬼注:
我想再补充一点,如果上述方法对您不起作用,那么它将与 MSIL.So 相关,在这种情况下您需要分析 Roslyn 从该代码生成的内容。
如果是这种情况,那么您还可以使用任何会向您显示生成的 MSIL 的 Reflector 工具进行检查。
.NET 原始类型的源代码位于 http://referencesource.microsoft.com/,如 @Sadaquat 所示。
你说的具体实现大概是implementation of IConvertable.ToInt32()
from the Char
struct.
那只是 returns Convert.ToInt32(char value)
,它本身只是 returns 值,因为 char
是幕后的整数值。
在 C# 中,我们有一个叫做 单根统一类型系统 的东西。这意味着每个现有类型都是一个根类型的子类型。 Object
在 C# 中。所以 char
或 int
只是 System.Char
和 System.Int32
的缩写(别名)。从无类型 Object
到 long
或 char
(值类型)的转换称为 (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(系统名称space)可以在https://github.com/dotnet/coreclr/tree/master/src/mscorlib/src/System
下的github上找到此外,由于值类型是完整的对象(结构),因此在运行时可以使用大量 type/meta 信息。
例如,与 C++ 相比,C# 是一种更安全的语言。它不允许不安全的隐式转换。
从 char
到 int
的转换是 widening
。 Int
比 char
bigger/has 多 space。投射是安全的。
但这就是为什么它与 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