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。
我正在尝试学习 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。