c# - 转换和转换是一回事吗?

标签 c# clr casting

在 Jesse Liberty 的 Learning C# 一书中,他说“一种类型的对象可以转换为另一种类型的对象。这称为转换。”

如果您调查从下面的代码生成的 IL,您可以清楚地看到转换后的赋值与转换后的赋值不同。在前者中,您可以看到正在发生的装箱/拆箱;在后者中,您可以看到对转换方法的调用。

我知道最后这可能只是一个愚蠢的语义差异——但只是转换的另一个词。我并不是要刻薄,但我对任何人对此的直觉不感兴趣——意见在这里不算数!任何人都可以指出一个明确的引用来确认或否认转换和转换是否是同一件事?

    object x;
    int y;

    x = 4;

    y = ( int )x;

    y = Convert.ToInt32( x );

谢谢

在 Matt 关于显式/隐式的评论之后添加的注释:

我认为隐式/显式没有区别。在我发布的代码中,两种情况下的更改都是明确的。将 short 分配给 int 时会发生隐式转换。

给 Sklivvz 的备注:

我想确认我对 Jesse Liberty(否则通常清晰明了)语言松散的怀疑是正确的。我认为 Jesse Liberty 的语言有点松散。我知道转换是在对象层次结构中路由的——即,您不能从整数转换为字符串,但可以从派生自 System.Exception 的自定义异常转换为 System.Exception。

不过,有趣的是,当您尝试将 int 转换为 string 时,编译器会告诉您它无法“转换”该值。也许杰西比我想象的更正确!

最佳答案

绝对不是!

Convert 试图通过“任何可能的方式”为您提供 Int32。 Cast 不做任何事情。使用强制转换,您告诉编译器将对象视为 Int,无需转换。

当您知道(通过设计)对象是 Int32 或另一个具有 Int32 转换运算符的类(例如 float)时,您应该始终使用转换。

Convert 应该与 String 或其他类一起使用。

试试这个

static void Main(string[] args)
{
    long l = long.MaxValue;

    Console.WriteLine(l);

    byte b = (byte) l;

    Console.WriteLine(b);

    b = Convert.ToByte(l);

    Console.WriteLine(b);

}

结果:

9223372036854775807

255

Unhandled Exception:

System.OverflowException: Value is greater than Byte.MaxValue or less than Byte.MinValue at System.Convert.ToByte (Int64 value) [0x00000] at Test.Main (System.String[] args) [0x00019] in /home/marco/develop/test/Exceptions.cs:15

关于c# - 转换和转换是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45964194/

相关文章:

python - 为什么对数字调用 float() 比在 Python 中添加 0.0 慢?

c - 无法知道 Iotivity 框架中语句 "(void) ipAddr; (void) port;"的使用

c# - 类型转换查询.Net C#

c# - 平滑曲线的算法

c# - 在 .net 4.0 wpf 应用程序中使用 .Net 2.0 dll

windows - 如何检测 CLR 抛出的异常?

c# - 为什么 Nullable<T> 是一个结构体?

c# - OPENGL如何使用glTexImage3D函数

c# - 无法使用 C# 或 VB 检索 Web 服务响应

c# - 有没有办法在 .NET 4 中使用 C# 6 或更高版本?