Ошибки PascalABC.NET

Кхм, однако лично для I2.f1 это работает:

    function f1: T := a;
    
    function I2.f1: object := a;

Так даже вся программа откомпилируется, но это не симметрично => уродливо, кроме того - не работает если оба интерфейса - шаблоны. А как для I1.f1 так же сделать?

    function I1.f1: T := a;

Program1.pas(14) : Количество шаблонных параметров типа I1<T> должно равняться 1

    function I1<T>.f1: T := a;

Program1.pas(9) : Класс C1<T> не реализует метод f1:T интерфейса I1<T>

    function I1&<T>.f1: T := a;

Program1.pas(14) : Встречено '&', а ожидалось ';'

1 лайк

вот это баг. все остальное не баги. запостите на гитхаб

Почему все остальные не баги? Можете обосновать?

1 лайк

И правда, интересный вопрос. Ну, #1, допустим не должно работать потому что:

type
  I1<T>=interface end;
  
  C1<T1, T2>=class(I1<T1>, I1<T2>)
  
  end;

begin end.

В таком случае надо явно указать к какому из этих 2 интерфейсов относится функция.

А вот последнее не понятно, @Admin можете дать чёткое определение работе &? Оно только для функций должно работать? У меня вроде получилось недавно запихнуть его перед спецификатором шаблона класса и оно ничего не сделало, это ошибка?

Могу. Он позволяет сказать внутри выражения, что это точно не операция <

Вот как… Тогда в варианте #3 оно, конечно, бесполезно, но и причин запрещать ведь нет?

Знать бы еще, что такое #3

1 лайк

@Admin, почему при таком коде:

type
  TBase = abstract class
  public
    procedure Print() := Write(ToString());
    procedure Println() := Writeln(ToString());
  end;
  
  TDerived = class(TBase)
  public 
    Value: integer;
    
    function ToString(): string; override := $'TDerived: Value = {Value}';
  end;

begin
  var A := new TDerived();
  A.Value := 1;
  A.Println();
end.

Выводится:

TDerived: Value = 1

Но если заменю на:

function ToString() := $'TDerived: Value = {Value}';

, то вывод:

Program2.TDerived

Почему так происходит?

Также второй вопрос:

type
  TMy<T> = class(System.ICloneable)
  public
    Value: T;
    
    constructor(value_: T);
    begin
      Value := value_;
    end;
    
    function Clone(): object := new TMy<T>(Value);
    function CloneAs() := TMy<T>(Clone());
  end;

begin
end.

Почему:

Program3.pas(12) : Ожидалась переменная

? На C# подобный код работает…

Используйте Clone() as TMy

Преобразование типов у нас имеет ограничение - тип должен быть простым именем

1 лайк

Прошу все ограничения написать в справке по PascalABC.Net, чтобы не было вопросов.

А там всё написано. Вы просто невнимательно читаете или неверно трактуете.

Потому что в C языках override ставить необязательно, его используют чтоб компилятор подсказывал, вдруг чего не так. А в паскале если вы его не поставили - значит эта функция не является частью цепочки.

1 лайк

Могли ли бы указать раздел справки в котором сказано про данное ограничение приведения типов?

Спасибо за ответ, теперь понятно.

Справку вообще надо сильно чинить, доделывать и переделывать. По мелочи чинить просто бесполезно.

2 лайка

Операция явного приведения типов Операция явного приведения типов имеет вид

ИмяТипа(выражение)

type t1<T> = class end;

procedure p1<T>(self:t1<T>;a:T); extensionmethod := exit;

begin
  var a := new t1<byte>;
  a.p1(5);//Generic-функция p1 не может быть вызвана с данным набором фактических параметров
end.

Но ведь 5 можно неявно преобразовать к byte, и если написать p1&<byte> - его таки преобразовывает. Это ошибка?

1 лайк

И ещё, то что ?. в глобальных выражениях падает есть на гитхабе, а то что оно не форматируется даже в блоке имеет смысл туда добавлять?

begin
  var a:=new byte[0];
  var b := a?.Max;
end.

Компилируется нормально, но форматирование выдаёт:

System.NotImplementedException: Метод или операция не реализована.
   в CodeFormatters.CodeFormatter.DefaultVisit(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(var_def_statement _var_def_statement)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(statement_list _statement_list)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.visit(program_module _program_module)
   в CodeFormatters.CodeFormatter.visit_node(syntax_tree_node sn)
   в CodeFormatters.CodeFormatter.FormatTree(String Text, compilation_unit cu, Int32 cursor_line, Int32 cursor_col)
   в VisualPascalABC.CodeFormattingAction.Execute(TextArea textArea)
   в System.Windows.Forms.ToolStripItem.RaiseEvent(Object key, EventArgs e)
   в System.Windows.Forms.ToolStripButton.OnClick(EventArgs e)
   в System.Windows.Forms.ToolStripItem.HandleClick(EventArgs e)
   в System.Windows.Forms.ToolStripItem.HandleMouseUp(MouseEventArgs e)
   в System.Windows.Forms.ToolStrip.OnMouseUp(MouseEventArgs mea)
   в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   в System.Windows.Forms.Control.WndProc(Message& m)
   в System.Windows.Forms.ToolStrip.WndProc(Message& m)
   в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)