请考虑以下代码:
class Program
{
static void Main(string[] args)
{
int intVal = 1;
double doubleVal = 1;
float floatVal = 1;
decimal decimalVal = 1;
Console.WriteLine((char)intVal);
Console.WriteLine((char)doubleVal);
Console.WriteLine((char)floatVal);
Console.WriteLine((char)decimalVal);
}
}
该代码有效。不起作用的代码:
class Program
{
static void Main(string[] args)
{
IConvertible intVal = 1;
IConvertible doubleVal = 1d;
IConvertible floatVal = 1f;
IConvertible decimalVal = 1m;
// System.InvalidCastException: 'Unable to cast object of type 'System.Int32' to type 'System.Char'.'
Console.WriteLine((char)intVal);
Console.WriteLine((char)doubleVal);
Console.WriteLine((char)floatVal);
Console.WriteLine((char)decimalVal);
}
}
为什么?
IConvertible intVal = 1;
将值框到对象。您正在执行的操作类似于以下内容:
object intVal = 1;
Console.WriteLine((char)intVal );
不能将object
(在本例中为 Int32 类型(直接强制转换为char
。由于intVal
是IConvertible
,如果可以接受,您可以使用intVal.ToChar(CultureInfo.InvariantCulture);
。
装箱值类型只能取消装箱为其类型。这与这不起作用的原因相同:
object o = 1;
var d = (double)o;