Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2011, 14:13   #1
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
Восклицание вопрос по Dictionary

Добрый день! Может кто подскажет в чем проблема.. Пишу так:


Код:
private struct StructRow
        {
            public DateTime ReceivedTime;
            public Object[] Row;
        }
 
private Dictionary<string, StructRow> fListRow;
 
...
 
StructSecCodeRow Row = new StructRow(); //создаем новую структуру
Row.ReceivedTime = e.DataReceivedTime; //записываем время принятия данных
fListRow.Add(Key, Row); //добавляем данную структуру с данным ключом

далее если пробовать изменять какой нибудь элемент fListRow


Код:
fListRow[Key].ReceivedTime = e.DataReceivedTime;
                            while (col < ColCount)
                            {
                                fListRow[Key].Row[col] = e.Table[row, col]; // записываем все данные по строке
                                col++;
                            }

то на fListRow[Key].ReceivedTime = e.DataReceivedTime; ругается и говорит что : "Ошибка 1 Не удалось изменить возвращаемое значение для "System.Collections.Generic.Diction ary<string, StructRow>.this[string]", т.к. оно не является переменной".

Но на fListRow[Key].Row[col] = e.Table[row, col]; не ругается и если сделать вот так:



Код:
private struct StructRow
        {
            public DateTime[] ReceivedTime;
            public Object[] Row;
        }

добавление :


Код:
StructRow Row = new StructRow(); //создаем новую структуру
                                StructRow .ReceivedTime = new DateTime[1];
                                StructRow .ReceivedTime[0] = e.DataReceivedTime; //записываем время принятия данных

и изменение:


Код:
fListRow[Key].ReceivedTime[0] = e.DataReceivedTime;
                            while (col < ColCount)
                            {
                                fListRow[Key].Row[col] = e.Table[row, col]; // записываем все данные по строке
                                col++;
                            }

то все замечательно работает!

Может кто сталкивался с этим, и подскажет почему так получается? Может проблема в типе значения и ссылочном типе? Заранее спасибо за ответ!
atagilov вне форума Ответить с цитированием
Старый 08.10.2011, 15:23   #2
Руслантус
Наркоман самоучка
Форумчанин
 
Аватар для Руслантус
 
Регистрация: 22.07.2007
Сообщений: 276
По умолчанию

Когда вы обращаетесь к словарю, чтобы получить значение, он вам возвращает копию структуры. Так как в первом варианте возвращается ещё и копия структуры DateTime, то происходит ошибка, ибо смысла в таком присвоении нет.
Во втором случае, всё работает, потому-что вы обращаетесь к одной и той же ссылке массива.

Что делать? Ответ очевиден - используйте класс.
#include <мозг.h>
Руслантус вне форума Ответить с цитированием
Старый 08.10.2011, 16:11   #3
atagilov
Пользователь
 
Регистрация: 22.06.2011
Сообщений: 11
По умолчанию

Спасибо!
atagilov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dictionary bank_notes Microsoft Office Excel 3 23.02.2010 01:12
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
English Dictionary v1.0 (просьба потестить немного) Rebel123 Мультимедиа в Delphi 7 21.08.2009 22:07
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10