Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: C# Массивы и коллекции.  (Прочитано 4061 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Сергей
Интересующийся

ua
Offline Offline

« : 05-02-2011 19:45 » 

Всем привет.
Объясните, пожалуйста. Почему нельзя произвести присвоение в пользовательской коллекции так само как в пользовательском массиве и как это сделать правильно.
Код:
using System;
using System.Collections;
class Inventory
{
    public string name;
    double cost;
    int onhand;
    public Inventory(string n, double c, int h)
    {
        name = n;
        cost = c;
        onhand = h;
    }
    public override string ToString()
    {
        return
        String.Format("{0,-10}Стоимость: {1,7:C} Наличие: {2}", name, cost, onhand);
    }
}
class InventoryList
{
    static void Main()
    {
        ArrayList inv = new ArrayList();
        // Добавить элементы в список,
        inv.Add(new Inventory("Кусачки", 5.95, 3));
        inv.Add(new Inventory("Отвертки", 8.29, 2));
        inv.Add(new Inventory("Молотки", 3.50, 4));
        inv.Add(new Inventory("Дрели", 19.88, 8));
        Console.WriteLine("Перечень товарных запасов:");
        foreach (Inventory i in inv)
        {
            Console.WriteLine(" " + i);
        }
        Inventory[] dfdf = new Inventory[4];
        dfdf[0] = new Inventory("Кусачки", 5.95, 3);
        dfdf[1] = new Inventory("Отвертки", 8.29, 2);
        dfdf[2] = new Inventory("Молотки", 3.50, 4);
        dfdf[3] = new Inventory("Дрели", 19.88, 8);
        Console.WriteLine();
        foreach (Inventory i in dfdf)
        {
            Console.WriteLine(" " + i);
        }


        dfdf[2].name = "Лом";
        inv[2].name = "Лом"; // Ошибка


        Console.WriteLine();
        foreach (Inventory i in dfdf)
        {
            Console.WriteLine(" " + i);
        }
    }
}
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 05-02-2011 22:05 » 

Сергей, ArrayList - это класс, оставшийся с версии 1.x, он хранит элементы типа object. После появления в версии 2.0 порождающих типов, вместо ArrayList лучше использовать List<Inventory> - тогда ошибки не будет.

Если же хочется использовать ArrayList, то присвоение должно сопровождаться приведением типов:
Код: (C#)
(inv[2] as Inventory).name = "Лом";
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Сергей
Интересующийся

ua
Offline Offline

« Ответ #2 : 05-02-2011 22:57 » 

Спасибо за подсказку. Как говорится: Век живи век учись.
В принципе я пару раз прочитал необобщенные и обобщенные коллекции, но как-то самому даже и в голову не пришло попробовать на всякий случай обобщенные.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines