Нельзя раширять операции +,+=,-,-= для делегатов
Зачем это ограничение?
Нельзя раширять операции +,+=,-,-= для делегатов
Зачем это ограничение?
По той же причине, почему нельзя расширить эти операции для 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
).
Добрый день. Возникла проблема, с которой ни разу не сталкивались. Слушатель курсов переподготовки установил несколько версий PascalABC.NET на свой ноут, и все время получает ошибку: Ошибка чтения PCU файла ‘C:\Program Files (x86)\PascalABC.NET\Lib__RedirectIOMode.pcu’. Работать не может. Чем можно помочь? У нее Windows 8 (как сказала).
Ну, дык, пусть снесёт всё и поставит одну… Желательно последнюю ;–)
Такая ошибка происходит когда pcu одной версии используется в другой версии. Конечно, можно всё снести и переустановить в новый каталог. Ещё можно перекомпилировать RedirectIOMode.pas на этой машине и положить получившийся pcu в папку lib
Похоже, для „глухого телефона“ ТС vs „как сказала“, это не вариант ;–)