Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюк с Generics, то ли у компилятора, то ли у меня 
:(
    Опции темы
Matematik
Дата 10.8.2013, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Наткнулся на интересное поведение компилятора.
Вот класс "шаблона":
Код

type
  TTest2<T> = class(TList<TPair<string,T>>)
  public
    procedure Test(Index: Integer; I: T);
  end;

implementation

procedure TTest2<T>.Test(Index: Integer; I: T);
begin
  List[Index].Key := 'test'; // [dcc32 Error] uTest2.pas(25): E2064 Left side cannot be assigned to
  List[Index].Value := I;  // [dcc32 Error] uTest2.pas(25): E2064 Left side cannot be assigned to
end;

Бац и ошибка компиляции - Left side cannot be assigned to ?!
List - это у класса TList<T> (System.Generics.Collections.pas)
Код

private
  type
    arrayofT = array of T;
  var
    FItems: arrayofT;
public
    property List: arrayofT read FItems;

Вот тоже самое, но без шаблона:
Код

type
  TTest1 = class(TList<TPair<string,Integer>>)
  public
    procedure Test(Index: Integer; I: Integer);
  end;

implementation

procedure TTest1.Test(Index: Integer; I: Integer);
begin
  List[Index].Key := 'test';
  List[Index].Value := I;
end;

Так компилируется и работает.
Вопрос: почему так?
Спасибо.

Добавлено @ 14:17
Забыл, windows компилятор 32битный XE4 Update1 

Это сообщение отредактировал(а) Matematik - 10.8.2013, 14:18
PM MAIL WWW ICQ   Вверх
Illusion Dolphin
Дата 10.8.2013, 16:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Код

procedure TTest2<T>.Test(Index: Integer; I: T);
var
  Pair: TPair<string,T>;
begin
  Pair.Key := 'test';
  Pair.Value := I;
  Items[Index] := Pair;
end;

Так не пойдёт?


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Matematik
Дата 10.8.2013, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Пойдет конечно, еще можно через указатель получить доступ 
Код

  P := @List[Index];
  P^.Key := 'test';
  P^.Value := I;


Но вопрос не как обойти, а почему оно ведет себя так странно? Должно же быть логическое объеснение, например, "баг в компиляторе" )))
PM MAIL WWW ICQ   Вверх
Illusion Dolphin
Дата 10.8.2013, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

Пойдет конечно, еще можно через указатель получить доступ 

Через указатель можно куда угодно доступ получить smile

Цитата

а почему оно ведет себя так странно


Цитата

  List[Index].Key := 'test';

У лист есть getter и setter. Оно возвращяет и принимает TPair<string,T>, и ничего другого. И в такой конструкции надо присвоить не TPair<string,T>, а его часть, чего компилятор не умеет.


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Matematik
Дата 10.8.2013, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 17
Всего: 50



Немного не так
Getter\setter есть у Items, да, ему невозможно сделать так
Код

Items[Index].Key := '';

А List - это почти прямой доступ к массиву
Код

    property Items[Index: Integer]: T read GetItem write SetItem; default;
    property List: arrayofT read FItems;

И код работает
Код

List[Index].Key := '';

но только для обычного класса, а не шаблона.
PM MAIL WWW ICQ   Вверх
Illusion Dolphin
Дата 10.8.2013, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 36
Всего: 63



Цитата

И код работает

К сожалению, generics в делфи не такие мощные, как в c++/c#, там можно горы свернуть, тем более там есть lambda, linq... А компилятор делфи идёт своим путём smile Если есть аккаунт на codegear можно в cc их написать - может отпишутся чего, скорее всего "by design" http://liferaycms.files.wordpress.com/2011...ature.jpg?w=630

Добавлено @ 22:49
Кстати в c# такое не работает smile Так что наверное в женериках они пошли по общепринятым стопам.

Код

    public struct A
    {
        public string a;
        public string b;
    } 
    class Program
    {
        static void Main(string[] args)
        {
            List<A> a = new List<A>();
            a[0].a = "0";
        }
    }

Ошибка там почти такая же, но лаконичнее описана, имхо.
Код

Error    1    Cannot modify the return value of 'System.Collections.Generic.List<ConsoleApplication1.A>.this[int]' because it is not a variable    
E:\SVN\ConsoleApplication1\ConsoleApplication1\Program.cs    19    13    ConsoleApplication1



Это сообщение отредактировал(а) Illusion Dolphin - 10.8.2013, 22:50


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0599 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.