C# 概念拆箱

C# Concept Unboxing

我正在尝试学习 C# 装箱和拆箱概念。 我用整数填充了对象列表,然后我想将它们汇总为控制台输出结果。

List<object> listOfObjects = new List<object>();
//var listOfObjects = new List<object>();

//adding first string to list
listOfObjects.Add("First string");

//adding integers to list
for (int j = 0; j < 5; j++)
{
    listOfObjects.Add(j);
}
listOfObjects.Add("Second string");
for (int k = 5; k < 10; k++)
{
    listOfObjects.Add(k);
}
foreach (var obj in listOfObjects)
{
    Console.WriteLine(obj);
}
var sum = 0;
for (var l = 0;  l < 4;  l++)
{
    sum += (int)listOfObjects[l];            
}
Console.WriteLine(sum);

但输出抛出异常

Exception thrown: 'System.InvalidCastException' in ConsoleApp.exe An unhandled exception of type 'System.InvalidCastException' occurred

sum += (int)listOfObjects[l] // this unboxing cause compile error

有人知道为什么吗? 我使用了 MSDN resource.

中的示例

问题是这样的行:

listOfObjects.Add("First string");

这会将 string 添加到列表中,尝试将其转换为 int 毫无意义。

删除这样的行,您应该会得到一个输出。

'System.InvalidCastException' -> 说你投错了。

因此,如果我们要从列表中获取特殊范围的项目, 在 cast 它们到 (int) 之后, 然后我们得到 unboxing.

的结果

因为装箱已经在给Lis加号的时候做了

希望这个详细的回复会更加友好。

列表 listOfObjects = new List(); //var listOfObjects = new List();

        //adding first string to list
        listOfObjects.Add("First string");

        //adding integers to list
        for (int j = 0; j < 5; j++)
        {
            listOfObjects.Add(j);
        }
        listOfObjects.Add("Second string");
        for (int k = 5; k < 10; k++)
        {
            listOfObjects.Add(k);
        }
        foreach (var obj in listOfObjects)
        {
            Console.WriteLine(obj);
        }
        var sum = 0;
        for (var l = 0; l < 4; l++)
        {

            var a = listOfObjects[l].GetType();

            if (a == typeof(int))
            {
                sum += (int)listOfObjects[l];
                Console.WriteLine("I've get an integer type.");

            }
            Console.WriteLine("I've get only string type.");
        }
        Console.WriteLine(sum);

        Console.Read();

希望这个修改后的示例对您有所帮助。祝你好运!

由于您的 listOfObjects 是一个 List,其内容类型为 object,您可以向其中添加任何内容。您首先添加一个 string,这是一个对象。然后你添加一堆 int 类型的数字,这是一个 值类型 ,所以这些数字被 装箱 成一个 object 在它们被添加到列表之前。然后你添加另一个 string。然后你添加另一组 int 类型的数字,再次像以前一样装箱。

您的问题出在最后一个循环中,您在其中循环了前 4 个元素。第一个元素是 string,因此您不能将其转换为 int。