不同的类型转换方式.有什么不同

Sha*_*pta 4 .net c# types casting type-conversion

我试图在类型转换方法之间找到区别.

例如.

方法1

public byte fun()
{
   object value=1;
   return (byte)value; // this gives me error
}
Run Code Online (Sandbox Code Playgroud)

方法2

public byte fun()
{
   object value=1;
   return byte.Parse(value.ToString()); // this runs 
}
Run Code Online (Sandbox Code Playgroud)

方法3

public byte fun()
{
   object value=1;
   return Convert.ToByte(value); // this runs
}
Run Code Online (Sandbox Code Playgroud)

这三者之间有什么区别.他们如何在内部工作.这里的值类型和参考类型是什么.哪个函数可以将值类型转换为ref类型,反之亦然

编辑2

当我写这行时,默认情况下int32,byte或其他什么数据类型'1'将被处理.

对象值= 1;

Ree*_*sey 8

这里有很多问题.

方法1失败,因为您无法在单个操作中执行unbox和转换.您将"值"设置为盒装整数.当您尝试进行强制转换时,您将取消装箱整数并尝试在单个操作中强制转换为一个字节,但这会失败.这确实有效,顺便说一下:

return (byte)( (int)value) ); // Unbox, then cast, in two operations
Run Code Online (Sandbox Code Playgroud)

方法2的作用是因为您将整数转换为字符串,然后使用byte.Parse将其转换为字节.这是非常昂贵的,因为它是来自/来自字符串.

方法3之所以有效,是因为它看到值中的对象是IConvertible(int),并使用适当的转换操作转换为byte.在这种情况下,这可能是一种更有效的方法.由于"value"存储一个int,而int支持IConvertible,Convert.ToByte基本上会进行空检查,然后调用Convert.ToByte(int),这是非常快的(它确实绑定了检查,并且直接转换).

我建议阅读Eric Lippert的博客文章" Representation and Identity".它详细介绍了铸造,并解释了方法1失败的原因......