C# Концепция распаковки - PullRequest
       42

C# Концепция распаковки

1 голос
/ 21 февраля 2020

Я пытаюсь выучить 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);

, но на выходе выдается исключение

Возникло исключение: 'System.InvalidCastException' в ConsoleApp.exe Произошло необработанное исключение типа 'System.InvalidCastException'

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

Кто-то знает почему? Я использовал пример из MSDN ресурса .

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Поскольку ваш listOfObjects является List, содержимое которого имеет тип object, вы можете добавить к нему что угодно. Сначала вы добавляете string, который является объектом. Затем вы добавляете набор чисел типа int, который является типом значения , так что числа в штучной упаковке в object перед их добавлением в список. Затем вы добавляете еще один string. Затем вы добавляете еще одну группу чисел типа int, снова как и раньше.

Ваша проблема в последнем l oop, где вы l oop поверх первых 4 элементов. Первый элемент - string, поэтому вы не можете привести его к типу int.

1 голос
/ 21 февраля 2020

Проблема состоит в следующем:

listOfObjects.Add("First string");

Это добавляет string к списку, и нет смысла пытаться преобразовать это в int.

Удалите такие строки, и вы должны получить вывод.

0 голосов
/ 21 февраля 2020

'System.InvalidCastException' -> говорит вам, что вы сделали неправильное приведение.

Так что, если мы возьмем особый диапазон предметов из списка, после приведение их к ( int ), тогда мы получим результат распаковка .

Поскольку бокс был сделан, когда вы добавили числа в Lis.

Надеюсь, что этот подробный ответ будет более дружелюбным.

List 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();

Надеюсь, этот измененный образец поможет вам. Удачи!

...