Ошибки PascalABC.NET

Почему ругается на строку 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.

Но если уберу скобки и имена интерфейсов - все нормально.

1 лайк

Жду исправлений.

Кажись, новый баг нашел: если написать:

//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 это ошибка или нет? Может хотя бы сделать более информативно?

1 лайк

Хорошо, в следующий раз буду убирать лишнее.

Это не ошибка. К сожалению, это слабый алгоритм анализа нелокальных имён в лямбдах, которые лямбда естественно хочет захватить. Для всего, что алгоритм не может отклассифицировать, он выдаёт ошибку об имени, которое не может захватить. Информативнее это сделать трудно - этот алгоритм и так сложный - и как раз если бы он знал, что такое System на тот момент, то и код бы сгенерировал. Когда Вы пишете uses, это ему подсказка, и он классифицирует System.

1 лайк

А можете улучшить алгоритм анализа? Я понимаю, что нелегко - но хотя бы попытаться же можно и при удачной попытке обновление сделать 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).

1 лайк

Добрый день. Возникла проблема, с которой ни разу не сталкивались. Слушатель курсов переподготовки установил несколько версий PascalABC.NET на свой ноут, и все время получает ошибку: Ошибка чтения PCU файла ‘C:\Program Files (x86)\PascalABC.NET\Lib__RedirectIOMode.pcu’. Работать не может. Чем можно помочь? У нее Windows 8 (как сказала).

Ну, дык, пусть снесёт всё и поставит одну… Желательно последнюю ;–)

Такая ошибка происходит когда pcu одной версии используется в другой версии. Конечно, можно всё снести и переустановить в новый каталог. Ещё можно перекомпилировать RedirectIOMode.pas на этой машине и положить получившийся pcu в папку lib

Похоже, для „глухого телефона“ ТС vs „как сказала“, это не вариант ;–)

Спасибо, попробуем.

Да, не очень понял. Если PascalABC.NET на машине не работает, то как перекомпилировать RedirectIOMode.pas? Да, и еще. Все началось, что установили последнюю версию. Потом уже ставили другие… Снося предыдущие…

Перекомпилировать, нажав кнопочку компиляции, а не запуска.

Если не работает - это плохо, надо понять, в чем дело. Во-первых, работает ли последняя версия на других машинах? На Вашей? Во-вторых, не надо ничего сносить - инсталлировать в чистый каталог и создать программу не в рабочем каталоге, а скажем в d:\W. Ошибка сохраняется или нет?

Это баг?

type
  a<T>=class 
    public class l: integer; 
  end;

begin
  a<integer>.l:=9; 
end.

Код даже не форматируется: Program1.pas(7) : Встречено ‘<’, а ожидалось ‘;’.

А что это вообще? Зачем тут < T > в описании класса? Но это и не баг, ибо сказано многократно: в этих случаях надо экранировать <, чтобы не выглядело операцией отношения, т.е. писать a&<integer>.l:=9; Другое дело, что при этом будет иная ошибка, но тут уж сами смотрите, что накодировали…

1 лайк

Хорошо, допустим, я экранировал, но как избавиться от: () : Внутренняя ошибка компилятора в модуле [pabcnetc.exe] :‘System.Exception: System.NotImplementedException: Метод или операция не реализована. в System.Reflection.Emit.FieldOnTypeBuilderInstantiation.get_FieldType() в PascalABCCompiler.NETGenerator.ILConverter.AssignToStaticField(IExpressionNode to, IExpressionNode from) в PascalABCCompiler.NETGenerator.ILConverter.ConvertStatement(IStatementNode value) в PascalABCCompiler.NETGenerator.ILConverter.visit(IStatementsListNode value) в PascalABCCompiler.NETGenerator.ILConverter.ConvertBody(IStatementNode body) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionBody(ICommonFunctionNode func) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFunctionsBodies(ICommonFunctionNode[] funcs) в PascalABCCompiler.NETGenerator.ILConverter.ConvertFromTree(IProgramNode p, String TargetFileName, String SourceFileName, CompilerOptions options, String[] ResourceFiles) в PascalABCCompiler.Compiler.Compile()’?

Вы не ответили на первый вопрос - зачем Вам < T >, если Вы его не используете? Или, как я уже приводил тот анекдот, Вы тоже из тех мужиков, что пилу рельсой испытывали?