Очень часто бывает, что “Ошибка времени выполнения: Индекс находился вне границ массива.” указывает на операторные скобки (begin). С чем это может быть связано?
Смотрите на следующую или предыдущую строчку, вроде все .Net языки имеют свойство время от времени промахиваться со строчкой ошибки.
Itellisence не понимает список, полученный из строки.
Нельзя раширять операции +,+=,-,-= для делегатов
Зачем это ограничение?
По той же причине, почему нельзя расширить эти операции для integer
В смысле? Для integer
их можно расширять.
специальные операции для делегатов, не имеющие ничего общего с арифметическими. их нельзя расширять.
Хотел спросить. Почему не работает это:
type
T1<T> = class
event E1: procedure;
procedure TryE1();
begin
if E1 <> nil then E1();
end;
end;
begin
var Obj := new T1<integer>();
Obj.E1 += Halt;
Obj.TryE1();
end.
?
Да, та же самая. Прошу исправить данный баг как можно скорее поскольку сильно мешает нормальному написанию кода. Заранее благодарен.
Почему ругается на строку 18: Program142.pas(18) : Нельзя преобразовать тип MyType к object?
type
TEventArgs = class
// Содержимое
end;
type
TEventArgsHandler = procedure(sender: object; e: TEventArgs);
type
MyType<T> = class(System.IEquatable<MyType<T>>, System.ICLoneable)
public
Value: T;
event Event1: TEventArgsHandler;
procedure TryEvent1();
begin
if Event1 <> nil then Event1(self, new TEventArgs());
end;
function Equals(obj: MyType<T>) := true;
function Clone(): object := self; // Заглушка
end;
procedure H(sender: object; e: TEventArgs) := WriteLn('Hello world!');
begin
var O1 := new MyType<integer>();
O1.Event1 += H;
O1.TryEvent1();
end.
Но если уберу скобки и имена интерфейсов - все нормально.
Жду исправлений.
Кажись, новый баг нашел: если написать:
//uses System;
const
Path = 'C:\Файлы\Уроки\Алгоритмизация\Вариант 511.txt';
type
///Тип детали.
TDetail = record
private
_Name: string;
_Weight: integer;
_IsPresent: boolean;
public
///Имя
property Name: string read _Name write _Name;
///Вес
property Weight: integer read _Weight write _Weight;
///Состоянее
property IsPresent: boolean read _IsPresent write _IsPresent;
constructor(name_: string; weight_: integer; isPresent_: boolean);
begin
Name := name_;
Weight := weight_;
IsPresent := isPresent_;
end;
///Возвращает строковое представление объекта типа TDetail.
function ToString() := Format('Detail: (Name: {0}, Weight: {1}, State: {2}).', _Name, _Weight, _IsPresent);
end;
begin
var Details := ReadAllLines(Path).Select(x ->
begin
var l := x.ToWords();
try
Result := new TDetail(l[0], StrToInt(l[1]), l[2] = 'true')
except on System.FormatException do
Writeln('Ошибка: неверный формат входных данных.');
end;
end);
Details.Where(x -> (x.Weight > 10) and (x.Weight < 50)).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
Details.Where(x -> not x.IsPresent).Select(x -> x.ToString()).JoinIntoString(NewLine).Println();
end.
Неожиданное: Вариант 511.pas(38) : В данной версии компилятора не поддерживается замыкание данного типа символов, однако если раскомментировать строку 1, то все работает.
Вот вариант без лишнего, только давайте вы сами попробуете лишнее убрать в следующий раз:
//uses System;//если раскомментировать - ошибки нет
begin
var a: ()->() := ()->
try
except
on System.InvalidCastException do//любой исключение из system
end;
end.
@Admin это ошибка или нет? Может хотя бы сделать более информативно?
Хорошо, в следующий раз буду убирать лишнее.
Это не ошибка. К сожалению, это слабый алгоритм анализа нелокальных имён в лямбдах, которые лямбда естественно хочет захватить. Для всего, что алгоритм не может отклассифицировать, он выдаёт ошибку об имени, которое не может захватить. Информативнее это сделать трудно - этот алгоритм и так сложный - и как раз если бы он знал, что такое System на тот момент, то и код бы сгенерировал. Когда Вы пишете uses, это ему подсказка, и он классифицирует System.
А можете улучшить алгоритм анализа? Я понимаю, что нелегко - но хотя бы попытаться же можно и при удачной попытке обновление сделать PABC.Net. Текст ошибки не очень информативный, кстати: В данной версии компилятора не поддерживается замыкание данного типа символов.
@Admin так а всё же, вы сказали что эти операторы нельзя расширять для integer
хотя их можно, и по аналогии с делегатами это следовало бы запретить. То что следующий код компилируется это ошибка?
function operator+(i1, i2: integer): integer; extensionmethod;
begin end;
function integer.operator*(i1, i2: integer): integer;
begin end;
begin end.
С++ вот к примеру запрещает перезагружать операторы 2 вшитыми типами, даже если это новая пара (как int
и double
).