为什么从 int、double、float 和 decimal 转换为 char 有效,但是当这些相同的变量事先转换为 IConvertible 时,不行吗?



请考虑以下代码:

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。由于intValIConvertible,如果可以接受,您可以使用intVal.ToChar(CultureInfo.InvariantCulture);

装箱值类型只能取消装箱为其类型。这与这不起作用的原因相同:

object o = 1;
var d = (double)o;

相关内容

  • 没有找到相关文章

最新更新